如何解决在for循环中声明未使用的变量?


87

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

['' for x in myList]

有效地创建一个新列表,该列表中的每个元素都包含一个空字符串,我从不使用x。有没有更干净的方式编写此代码,所以我不必声明未使用的x变量?

Answers:


130

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

['' for _ in myList]

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

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

[''] * len(myList)

10
后者必须伴随着一个巨大的警告,即它对可变对象没有起到预期的作用。

5
@Mohit:a=[[]]*4;a[0].append(5);print(a)
kennytm 2011年

@Ramy:Mohit发布了一个解释,但是被删除了:S无论如何,请在docs.python.org/py3k/library/…中查看Notes 2 。
kennytm 2011年

2
@ Ramy,Python在内存中为同一对象维护相同的引用。
Mohit Ranka

例如,是否执行嵌套for循环有关系吗?或者,如果for _ in range(...)我想说里面_, var = f(x)?这两个_变量之间会混淆吗?
埃里克·奥尔德'18

19

不。正如禅宗所说:特殊情况还不足以打破规则。特殊情况是循环不使用要迭代的事物的项,并且规则是存在要解压缩的“目标”。

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


然而pylint的抱怨C: 10,24: Invalid variable name "_" (invalid-name),除非你把它添加到good-names你的.pylintrc
giorgiosironi

12

事实证明,使用dummy*(起始字为虚拟)作为变量名与的技巧相同__是已知的标准,最好使用有意义的变量名。所以,你可以使用dummydummy1dummy_anything。通过使用这些变量名PyLint不会抱怨。


我确实更喜欢这种方法。它仍然有意义。
RvdK


1

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

def UnusedArgument(_):
  pass

然后像这样使用它

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

0

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

list(('' for x in myList))

应该可以。请注意,x未被定义为生成器理解范围之外的变量。


0

_如果您更喜欢为变量指定一个易于理解的名称,则还可以在变量名称前添加一个。例如,您可以使用_foo,和_foo1_anything而PyLint不会抱怨。在for循环中,它将像:

for _something in range(10):
    do_something_else()

编辑:添加示例


0

一种详细的方法是:

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

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

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

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



-1

如何评论在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仍指向相同的存储位置。换句话说,可变变量作用于变量所指向的相同存储位置,而不是像不变变量一样复制变量所指向的值。


谢谢你,但我真的不确定与这个问题有什么关系。(不,我没有拒绝投票)
Ramy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.