我怎样才能避免在列表理解中声明一个未使用的变量?

问题描述 投票:0回答:10

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

['' for x in myList]

有效地创建一个新列表,列表中的每个元素都有一个空字符串,我从不使用

x
。有没有更简洁的写法,这样我就不必声明未使用的
x
变量?

python list-comprehension
10个回答
143
投票

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

['' for _ in myList]

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

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

[''] * len(myList)

19
投票

没有。正如 Zen 所说:特殊情况还不足以打破规则。特殊情况是循环不使用被迭代的事物的项目并且规则是有一个“目标”可以解包。

然而,您可以使用

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


13
投票

事实证明,使用

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


2
投票

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

#pylint: disable=unused-variable

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

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' 有点令人不安。


0
投票

试试吧,很简单:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.