Pergunta

Inspirado pela esta pergunta.

Por que não há list.clear () em python? Eu encontrei várias perguntas aqui que dizem que a maneira correta de fazê-lo é uma das seguintes opções, mas ninguém disse por que não é apenas um método para ele.

del lst[:]
lst[:] = []

Embora possa ir contra a "zen de python" ter mais do que uma maneira de fazer algo, ele certamente parece mais óbvio para mim ter um "list.clear ()" método. Ele também cairia em linha com dicts e conjuntos, sendo que ambos têm .clear ().

me deparei com algumas mensagens para o python-dev e python-idéias sobre isso e não veio para uma resposta definitiva (ver aqui (2006) e aqui (2009)). Tem Guido pesava sobre ele? É apenas um ponto de contenção que não foi resolvido ainda ao longo dos últimos 4-5 anos?

Update: list.clear () foi adicionado em python em 3,3 - veja aqui

Foi útil?

Solução

Nos tópicos é ligada Raymond Hettinger resume muito bem as vantagens e desvantagens de adição esse método. Quando se trata de design de linguagem, é realmente importante para ser conservador. Veja por exemplo o "Cada característica começa com -100 pontos" princípio da # equipa C tem. Você não consegue algo tão limpo como Python, adicionando funcionalidades à toa. Basta dar uma olhada em alguns dos mais cruftier linguagens de script populares para ver onde ele leva você.

Eu acho que o método .clear() apenas nunca fez atravessar as implícitas -100 pontos governar para se tornar algo que vale a adição à linguagem núcleo. Embora tendo em conta que o methodname já é utilizado para uma finalidade equivalente ea alternativa pode ser difícil de encontrar, provavelmente não é tudo o que longe disso.

Outras dicas

Enquanto não houve list.clear() quando esta pergunta foi feita, 3.3 agora tem um (tal como solicitado na http: // erros .python.org / issue10516 ). Além disso, foram adicionados métodos clear() para bytearray e MutableSequence para facilitar a alternância entre listas e outras coleções (set, dict etc ).

Todos os detalhes da mudança pode ser encontrada href="http://docs.python.org/dev/whatsnew/3.3.html#other-language-changes" aqui .

Eu não posso responder ao porquê; mas não há absolutamente deve ser um, para diferentes tipos de objetos podem ser apagados com a mesma interface.

Um óbvio, simples exemplo:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    reqs.clear()

Isso requer apenas que o objeto suporte iteração, e que apoiar clear (). Se as listas tinha um método clear (), este poderia aceitar uma lista ou conjunto de forma igual. Em vez disso, desde conjuntos e listas têm uma API diferente para apagar seu conteúdo, que não funciona; você acaba com um corte desnecessariamente feio, como:

def process_and_clear_requests(reqs):
    for r in reqs:
        do_req(r)
    if getattr(reqs, "clear"):
        reqs.clear()
    else:
        del reqs[:]

Tanto quanto eu estou em causa, utilizando del obj [:] ou obj [:]. = [] São apenas desagradáveis, hacks unintuitive Para contornar o fato de que a lista está faltando clear ()

Isto está levando "reduzindo a redundância" a uma falha, onde ele danifica o consistência da língua, o que é ainda mais importante.

Como a que você deve usar, eu recomendo del obj [:]. Eu acho que é mais fácil de implementar para não-lista-como objetos.

Ao testar, muitas vezes é útil para configurar os dados que formam o domínio dos testes em variáveis ??globais, de modo que os testes podem construir um sobre o outro, se necessário / mais simples. Em tais casos, ter um método para limpar a lista que lhe permitem fazê-lo sem a necessidade de declarar essas variáveis ??como globais dentro de uma função (ou seja, os testes). Eu sei, os testes não deve depender de um outro ...

A pergunta deveria ser por isso que clear foi considerado necessário, em primeiro lugar. As seguintes obras para limpar qualquer coleção Python que eu possa pensar.

def clear(x):
    return type(x)()

>>> s = {1, 2, 3}
>>> s
set([1, 2, 3])
>>> s = clear(s)
>>> s
set([])
>>> l = [1, 2, 3]
>>> l
[1, 2, 3]
>>> l = clear(l)
>>> l
[]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top