Как я могу обойти объявление неиспользуемой переменной в цикле for? - PullRequest
67 голосов
/ 29 марта 2011

Если у меня есть понимание списка (например), например:

['' for x in myList]

Эффективно создавая новый список с пустой строкой для каждого элемента в списке, я никогда не использую x. Есть ли более чистый способ написания этого, так что мне не нужно объявлять неиспользованную переменную x?

Ответы [ 7 ]

108 голосов
/ 29 марта 2011

_ - это стандартное имя заполнителя для игнорируемых элементов в цикле for и присвоении кортежей, например,

['' for _ in myList]

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

Кстати, ваш список может быть написан без понимания списка (при условии, что вы хотите создать список неизменяемых элементов, таких как строки, целые числа и т. Д.).

[''] * len(myList)
17 голосов
/ 29 марта 2011

Нет.Как говорит дзен: особые случаи не настолько особенные, чтобы нарушать правила.Особый случай - циклы, не использующие элементы итерируемой вещи, и правило, согласно которому есть «цель» для распаковки.

Однако вы можете использовать _ в качестве имени переменной, которое обычнопонимается как «намеренно неиспользованный» (даже PyLint и т. д. знает и уважает это).

11 голосов
/ 12 марта 2015

Оказывается, что использование dummy* (начальное слово является фиктивным) в качестве имени переменной делает то же самое, что и _._ является известным стандартом, и было бы лучше использовать значимые имена переменных.Таким образом, вы можете использовать dummy, dummy1, dummy_anything.Используя эти имена переменных PyLint не будет жаловаться.

1 голос
/ 29 мая 2013

Если вам нужно назвать свои аргументы (например, при написании макетов, которые не используют определенные аргументы, на которые ссылается имя), вы можете добавить этот быстрый способ:

def UnusedArgument(_):
  pass

и затем используйте это как это

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)
0 голосов
/ 13 мая 2019

Вы также можете добавить к имени переменной _, если предпочитаете дать переменной понятное человеку имя. Например, вы можете использовать _foo, _foo1, _anything, и PyLint не будет жаловаться. В цикле for это будет выглядеть так:

for _something in range(10):
    do_something_else()

изменить: Добавить пример

0 голосов
/ 30 марта 2011

Комментарий к Как обойти объявление неиспользуемой переменной в цикле for? (Закончился размер комментария)

Python поддерживает ту же ссылку для созданного объекта.(независимо от изменчивости), например,

In [1]: i = 1

In [2]: j = 1

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

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

Вы можете видеть как i, так и j, ссылаясь на один и тот же объект в памяти. Что происходит, когда мы изменяем значение одной неизменяемой переменной.

In [5]: j = j+1

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

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

Вы можете видеть, что j теперь начинает указывать новое местоположение (где хранится 2), а я все еще указывает на местоположение, где хранится 1.При оценке

j = j+1

Значение выбирается из 142671248, рассчитывается (если еще не кэшировано) и помещается в новое местоположение 142671236. j делается для указания нового местоположения.Проще говоря, новая копия, создаваемая каждый раз при изменении неизменяемой переменной.

Изменчивость

Изменяемые объекты действуют немного иначе в этом отношении.Когда значение, обозначенное

In [16]: a = []

In [17]: b = a

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

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

, a и b указывают на одно и то же место в памяти.

In [20]: a.append(5)

Место в памяти, обозначенное символом a, изменяется.

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

И a, и b по-прежнему указывают на одну и ту же ячейку памяти.Другими словами, изменяемые переменные действуют в той же области памяти, на которую указывает переменная, вместо создания копии значения, на который указывает переменная, как в случае неизменяемой переменной.

0 голосов
/ 29 марта 2011

Объекты генератора фактически не используют переменные.Так что-то вроде

list(('' for x in myList))

должно сработать.Обратите внимание, что x не определен как переменная вне понимания генератора.

...