Python变量引用 - 带有zip的意外行为

时间:2012-07-03 14:06:39

标签: python

我真的以为我理解了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个项目,如果列表不足,则将变量设置为“无”?

3 个答案:

答案 0 :(得分: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永远不会看到变量abc,只看到它们绑定的值。

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

  

从列表中分配三个变量的优雅方法是什么?这个变量可以包含1-3个项目,如果列表不足则将变量设置为None?

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

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

然后使用vars[0]等或

x, y, z = (lst + [None] * 3)[:3]

答案 1 :(得分: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

答案 2 :(得分:0)

a值为None的原因是您从未将1分配给a。因此,您需要确保为其分配值。