如何绕过在for循环中声明一个未使用的变量?

时间:2011-03-29 18:26:01

标签: python list-comprehension

如果我有这样的列表理解(例如):

['' for x in myList]

有效地为列表中的每个元素创建一个空字符串的新列表,我从不使用x。有没有更简洁的方式来写这个,所以我不必声明未使用的x变量?

10 个答案:

答案 0 :(得分:108)

_是for循环和元组赋值中被忽略成员的标准占位符名称,例如。

['' for _ in myList]

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

BTW您的列表可以在没有列表理解的情况下编写(假设您要创建一个不可变成员列表,如字符串,整数等)。

[''] * len(myList)

答案 1 :(得分:17)

没有。正如禅宗所说:特殊情况不足以打破规则。特殊情况是循环不使用被迭代的东西的项目,规则是有一个“目标”来解包。

但是,您可以使用_作为变量名,通常被理解为“故意不使用”(即使PyLint等也知道并尊重它)。

答案 2 :(得分:10)

事实证明,使用dummy*(起始词为虚拟)作为变量名称与_具有相同的技巧。 _是一个已知标准,最好使用有意义的变量名称。因此,您可以使用dummydummy1dummy_anything。使用这些变量名称PyLint不会抱怨。

答案 3 :(得分:1)

在同一行的for循环之后添加以下注释:

#pylint:disable =未使用变量

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

答案 4 :(得分:0)

生成器对象实际上并不使用变量。像

这样的东西
list(('' for x in myList))

应该做的伎俩。请注意,x未定义为生成器理解之外的变量。

答案 5 :(得分:0)

如果需要命名参数(例如,在编写不使用名称引用的某些参数的模拟时),可以添加此快捷方法:

def UnusedArgument(_):
  pass

然后像这样使用它

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

答案 6 :(得分:0)

如果您希望为变量指定一个易于理解的名称,则还可以在变量名前加上_。例如,您可以使用_foo_foo1_anything,PyLint不会抱怨。在for循环中,就像:

for _something in range(10):
    do_something_else()

编辑:添加示例

答案 7 :(得分:0)

一种详细的方法是:

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

您避免以这种方式声明使用的变量。

您还可以将可变对象和不可变对象(如字典)附加到newList中。

像我这样的python新手的另一件事,'_','dummy'有点令人不安。

答案 8 :(得分:0)

尝试一下,很简单:

# Use '_' instead of the variable
for _ in range(any_number):
    do_somthing()

答案 9 :(得分:-1)

How can I get around declaring an unused variable in a for loop?的评论(超出评论大小)

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都仍然指向相同的内存位置。换句话说,可变变量作用于变量指向的相同内存位置,而不是复制变量指向的值,就像在不可变变量情况下一样。