Подтвердить что ты не робот

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

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

['' for x in myList]

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

4b9b3361

Ответ 1

_ - это стандартное имя-заполнитель для игнорируемых элементов в назначении for-loop и tuple, например

['' for _ in myList]

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

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

[''] * len(myList)

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

def UnusedArgument(_):
  pass

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

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

Ответ 5

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

list(('' for x in myList))

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

Ответ 6

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

for _something in range(10):
    do_something_else()

редактировать: добавить пример

Ответ 7

Добавьте следующий комментарий после цикла for в той же строке:

pylint: disable = unused-variable

for i in range(100): #pylint: disable=unused-variable

Ответ 8

Комментарий Как я могу обойти объявление неиспользуемой переменной в цикле for? (Ran out of comment size)

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

Оба а и 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

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