我真的以为我理解了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个项目,如果列表不足,则将变量设置为“无”?
答案 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
永远不会看到变量a
,b
和c
,只看到它们绑定的值。
阅读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
。因此,您需要确保为其分配值。