Como posso evitar declarar uma variável não utilizada em um loop for?

87

Se eu tiver uma compreensão de lista (por exemplo) como esta:

['' for x in myList]

Fazendo efetivamente uma nova lista que tem uma string vazia para cada elemento em uma lista, nunca uso o x. Existe uma maneira mais limpa de escrever isso para que eu não precise declarar a xvariável não utilizada ?

Ramy
fonte

Respostas:

130

_ é um nome de placeholder padrão para membros ignorados em um for-loop e atribuição de tupla, por exemplo

['' for _ in myList]

[a+d for a, _, _, d, _ in fiveTuples]

BTW, sua lista poderia ser escrita sem compreensão de lista (assumindo que você deseja fazer uma lista de membros imutáveis ​​como strings, inteiros, etc.).

[''] * len(myList)
Kennytm
fonte
10
Este último deve ser acompanhado por um grande aviso de que não faz a coisa esperada para objetos mutáveis.
5
@Mohit:a=[[]]*4;a[0].append(5);print(a)
kennytm
@Ramy: Mohit postou uma explicação, mas ela foi excluída: S De qualquer forma, verifique as Notas 2 em docs.python.org/py3k/library/… .
kennytm
2
@Ramy, Python mantém a mesma referência para o mesmo objeto na memória.
Mohit Ranka
Faz diferença se estou fazendo forloops aninhados , por exemplo? Ou se dentro for _ in range(...)eu quero dizer _, var = f(x)? Ficará confuso entre as duas _variáveis?
Eric Auld
19

Não. Como diz o Zen: casos especiais não são especiais o suficiente para quebrar as regras. O caso especial é que os loops não usam os itens da coisa que está sendo iterada e a regra é que há um "destino" para o qual descompactar.

Você pode, no entanto, usar _como nome de variável, que geralmente é entendido como "intencionalmente não usado" (até mesmo PyLint etc. sabe e respeita isso).

Cajado
fonte
O PyLint, entretanto, reclama disso, a C: 10,24: Invalid variable name "_" (invalid-name)menos que você o adicione ao good-namesseu .pylintrc.
giorgiosironi
12

Acontece que usar dummy*(a palavra inicial é fictícia) como o nome da variável faz o mesmo que _. _é um padrão conhecido e seria melhor usar nomes de variáveis ​​significativos. Assim você pode usar dummy, dummy1, dummy_anything. Usar esses nomes de variáveis PyLintnão reclamará.

Alfred
fonte
De fato, prefiro essa abordagem. permanece significativo.
RvdK de
2

Adicione o seguinte comentário após o loop for na mesma linha:

#pylint: disable = unused-variable

for i in range(100): #pylint: disable=unused-variable
Christopher Nuzzi
fonte
1

Se você precisar nomear seus argumentos (no caso, por exemplo, ao escrever simulações que não usam certos argumentos que são referenciados por nome), você pode adicionar este método de atalho:

def UnusedArgument(_):
  pass

e então usá-lo assim

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)
Kateroh
fonte
0

Os objetos geradores não usam realmente as variáveis. Então algo como

list(('' for x in myList))

deve fazer o truque. Observe que x não é definido como uma variável fora da compreensão do gerador.

alta largura de banda
fonte
0

Você também pode acrescentar um nome de variável com _se preferir dar à variável um nome legível por humanos. Por exemplo, você pode usar _foo, _foo1, _anythinge pylint não vai reclamar. Em um loop for, seria como:

for _something in range(10):
    do_something_else()

editar: Adicionar exemplo

Adam Scharf
fonte
0

Uma forma detalhada é:

newList = []
while len(newList) < len(mylist):
    newList.append('')

Você evita declarar uma variável usada desta forma.

Além disso, você pode anexar objetos mutáveis ​​e imutáveis ​​(como dicionários) em newList.

Outra coisa para iniciantes em python como eu, '_', 'dummy' são um pouco desconcertantes.

James Barton
fonte
0

Experimente, é simples:

# Use '_' instead of the variable
for _ in range(any_number):
    do_somthing()
Gavriel Cohen
fonte
-1

Comentário a Como posso evitar declarar uma variável não utilizada em um loop for? (O tamanho do comentário acabou)

Python mantém a mesma referência para o objeto criado. (independentemente da mutabilidade), por exemplo,

In [1]: i = 1

In [2]: j = 1

In [3]: id(i)
Out[3]: 142671248

In [4]: id(j)
Out[4]: 142671248

Você, pode ver tanto i como j, referem-se ao mesmo objeto na memória. O que acontece, quando mudamos o valor de uma variável imutável.

In [5]: j = j+1

In [6]: id(i)
Out[6]: 142671248

In [7]: id(j)
Out[7]: 142671236

você pode ver que j agora começa a apontar um novo local, (onde 2 está armazenado) e i ainda aponta para o local onde 1 está armazenado. Durante a avaliação,

j = j+1

O valor é escolhido de 142671248, calculado (se ainda não estiver em cache) e colocado em um novo local 142671236. j é feito para apontar para o novo local. Em termos mais simples, uma nova cópia feita toda vez que uma variável imutável é modificada.

Mutabilidade

Objetos mutáveis ​​agem um pouco diferente a esse respeito. Quando o valor apontado por

In [16]: a = []

In [17]: b = a

In [18]: id(a)
Out[18]: 3071546412L

In [19]: id(b)
Out[19]: 3071546412L

Tanto a quanto b apontam para o mesmo local de memória.

In [20]: a.append(5)

A localização da memória apontada por um é modificada.

In [21]: a
Out[21]: [5]

In [22]: b
Out[22]: [5]

In [23]: id(a)
Out[23]: 3071546412L

In [24]: id(b)
Out[24]: 3071546412L

Ambos, aeb, ainda apontam para o mesmo local de memória. Em outras palavras, variáveis ​​mutáveis ​​atuam na mesma localização da memória apontada pela variável, ao invés de fazer uma cópia do valor apontado pela variável, como no caso de variável imutável.

Mohit Ranka
fonte
Obrigado por isso, mas eu realmente não tenho certeza do que isso tem a ver com a pergunta. (não, eu não votei negativamente)
Ramy de