0

我真的以为我理解 Python 变量引用,所以我很困惑为什么这段代码没有使变量“a”变为“1”:

>>> a,b,c = None, None, None
>>> for var, val in zip((a,b,c),[1]):
...     var = val
... 
>>> print a
None
>>> print var
1

谁能解释一下 Python 在这里做什么?为什么“var”和“a”不指向同一个地方?

额外问题:从一个可以包含 1-3 个项目的列表中分配三个变量并在列表不足时将变量设置为 None 的优雅方法是什么?

4

3 回答 3

6

谁能解释一下 Python 在这里做什么?

它将变量的值分配给val变量var。它没有改变a。尝试以下操作以查看发生了什么:

>>> a, b, c = None, None, None
>>> print(zip((a,b,c), [1,2,3]))
[(None, 1), (None, 2), (None, 3)]

zip永远不会看到变量ab并且c,只是它们绑定的值。

在Code Like a Pythonista中阅读 Python 对变量(实际上是名称)的使用。

什么是从可以有 1-3 个项目的列表中分配三个变量并在列表不足时将变量设置为 None 的优雅方法?

不要动态构造变量。请改用列表。

vars = (lst + [None] * 3)[:3]

然后使用vars[0]等。或者

x, y, z = (lst + [None] * 3)[:3]
于 2012-07-03T14:08:08.453 回答
2

变量 a、b、c 在传递给时被评估为它们的值zip

>>> a,b,c = None, None, None
>>> zip((a,b,c),[1])
[(None, 1)]

然后,在您的循环中,您没有达到您的预期:

for var, val in [(None, 1)]:
    #-- here var is bound to the value None

    var = val
    #-- here var is bound to the value 1

    #print val
于 2012-07-03T14:11:51.147 回答
0

a 的值为 None 的原因是因为您从未分配1a. 因此,您需要确保为 a 分配了一个值。

于 2012-07-03T14:08:40.627 回答