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


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

['' for x in myList]

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

6 56

6 ответов:

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

['' for _ in myList]

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

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

[''] * len(myList)

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

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

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

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

list(('' for x in myList))

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

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

def UnusedArgument(_):
  pass

а потом использовать его вот так

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

комментарий как я могу обойти объявление неиспользуемой переменной в цикле 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, по-прежнему указывают на одну и ту же ячейку памяти. Другими словами, изменяемые переменные действуют из той же ячейки памяти, на которую указывает переменная, вместо того, чтобы делать копию значения, на которое указывает переменная, как в случае с неизменяемой переменной.