繁体   English   中英

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

[英]How can I get around declaring an unused variable in a for loop?

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

['' for x in myList]

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

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

['' for _ in myList]

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

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

[''] * len(myList)

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

但是,您可以使用_作为变量名,这通常被理解为“有意未使用”(甚至 PyLint 等都知道并尊重这一点)。

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

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

#pylint:禁用=未使用的变量

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

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

def UnusedArgument(_):
  pass

然后像这样使用它

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

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

list(('' for x in myList))

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

如果您更愿意为变量提供一个人类可读的名称,您也可以在变量名前加上_ 例如,您可以使用_foo_foo1_anything并且 PyLint 不会抱怨。 在 for 循环中,它会是这样的:

for _something in range(10):
    do_something_else()

编辑:添加示例

一个详细的方法是:

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

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

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

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

试试看,很简单:

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

评论如何避免在 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 仍然指向同一个内存位置。 换句话说,可变变量的行为与变量指向的内存位置相同,而不是复制变量指向的值,就像在不可变变量的情况下一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM