如何避免在列表推导中声明未使用的变量?
- 2025-03-19 08:57:00
- admin 原创
- 8
问题描述:
如果我有一个像这样的列表理解(例如):
['' for x in myList]
有效地创建一个新列表,其中列表中的每个元素都有一个空字符串,我从不使用x
。有没有更简洁的编写方法,这样我就不必声明未使用的x
变量?
解决方案 1:
_
是 for 循环和元组赋值中忽略成员的标准占位符名称,例如
['' for _ in myList]
[a+d for a, _, _, d, _ in fiveTuples]
顺便说一句,您的列表可以在没有列表理解的情况下编写(假设您想创建一个不可变成员的列表,如字符串,整数等)。
[''] * len(myList)
解决方案 2:
不。正如禅宗所说:特殊情况不足以打破规则。特殊情况是循环不使用被迭代事物的项目,规则是有一个要解包的“目标”。
但是,您可以将其用作_
变量名,这通常被理解为“故意未使用”(即使 PyLint 等也知道并尊重这一点)。
解决方案 3:
事实证明,使用dummy*
(起始词是虚拟的) 作为变量名可以达到与 相同的效果_
。_
这是一个已知标准,最好使用有意义的变量名。因此,您可以使用dummy
、dummy1
、dummy_anything
。使用这些变量名PyLint
不会出现任何问题。
解决方案 4:
在同一行的 for 循环后添加以下注释:
pylint:禁用=未使用的变量
for i in range(100): #pylint: disable=unused-variable
解决方案 5:
如果您需要命名您的参数(例如,在编写不使用名称引用的某些参数的模拟时),您可以添加此快捷方法:
def UnusedArgument(_):
pass
然后像这样使用它
def SomeMethod(name_should_remain):
UnusedArgument(name_should_remain)
解决方案 6:
生成器对象实际上并不使用变量。因此
list(('' for x in myList))
应该可以解决问题。请注意,x 未定义为生成器理解之外的变量。
解决方案 7:
如果您希望为变量指定一个人类可读的名称,也可以在变量名称前面加上_
。例如,您可以使用_foo
、_foo1
,_anything
PyLint 不会抱怨。在 for 循环中,它将是这样的:
for _something in range(10):
do_something_else()
编辑:添加示例
解决方案 8:
详细的方式是:
newList = []
while len(newList) < len(mylist):
newList.append('')
您避免通过这种方式声明已使用的变量。
您还可以将可变和不可变对象(如字典)附加到其中newList
。
对于像我这样的 Python 新手来说,另一件事是,'_','dummy' 有点令人不安。
解决方案 9:
尝试一下,很简单:
# Use '_' instead of the variable
for _ in range(any_number):
do_somthing()
解决方案 10:
如何避免在 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 的位置),而 i 仍然指向存储 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 仍然指向相同的内存位置。换句话说,可变变量指向相同的内存位置,而不是像不可变变量那样复制变量指向的值。