如果我有这样的列表理解(例如):
['' for x in myList]
有效地为列表中的每个元素创建一个空字符串的新列表,我从不使用x
。有没有更简洁的方式来写这个,所以我不必声明未使用的x
变量?
答案 0 :(得分:108)
_
是for循环和元组赋值中被忽略成员的标准占位符名称,例如。
['' for _ in myList]
[a+d for a, _, _, d, _ in fiveTuples]
BTW您的列表可以在没有列表理解的情况下编写(假设您要创建一个不可变成员列表,如字符串,整数等)。
[''] * len(myList)
答案 1 :(得分:17)
没有。正如禅宗所说:特殊情况不足以打破规则。特殊情况是循环不使用被迭代的东西的项目,规则是有一个“目标”来解包。
但是,您可以使用_
作为变量名,通常被理解为“故意不使用”(即使PyLint等也知道并尊重它)。
答案 2 :(得分:10)
事实证明,使用dummy*
(起始词为虚拟)作为变量名称与_
具有相同的技巧。 _
是一个已知标准,最好使用有意义的变量名称。因此,您可以使用dummy
,dummy1
,dummy_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都仍然指向相同的内存位置。换句话说,可变变量作用于变量指向的相同内存位置,而不是复制变量指向的值,就像在不可变变量情况下一样。