多个赋值语义

时间:2011-03-03 15:09:49

标签: python variable-assignment

在Python中可以做到:

a, b   = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2

我使用dis检查了生成的字节码,它们是相同的 那么为什么要这样呢?我是否需要其中一种而不是其他的?

5 个答案:

答案 0 :(得分:73)

当您需要在赋值的左侧包含更多结构时,有一种情况是当您要求Python解包稍微复杂的序列时。 E.g:

# Works
>>> a, (b, c) = [1, [2, 3]]

# Does not work
>>> a, b, c = [1, [2, 3]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack

这在过去被证明对我有用,例如,当使用枚举来迭代2元组的序列时。类似的东西:

>>> d = { 'a': 'x', 'b': 'y', 'c': 'z' }
>>> for i, (key, value) in enumerate(d.iteritems()):
...     print (i, key, value)
(0, 'a', 'x')
(1, 'c', 'z')
(2, 'b', 'y')

答案 1 :(得分:13)

Python元组通常可以使用或不使用括号编写:

a = 1, 2, 3

相当于

a = (1, 2, 3)

在某些情况下,您需要括号来解决歧义,例如,如果您想将元组(1, 2)传递给函数f,则必须编写f((1, 2))。由于有时需要使用括号,因此始终允许使用括号,就像您始终可以写(a + b)而不是a + b一样。

如果要解包嵌套序列,还需要括号:

a, (b, c) = 1, (2, 3)

似乎没有理由允许方括号,人们很少这样做。

答案 2 :(得分:2)

它们也是相同的,因为赋值从右到左发生,在右边,你有一种类型,它是两个元素的序列。当进行asignment调用时,序列被解包并查找相应的元素以匹配并给予这些值。 是的,在这种情况下,任何一种方式应该没有问题,其中序列被解包到各个元素。

答案 3 :(得分:2)

解包单元素iterable时,列表语法更漂亮:

a,=f()    # comma looks out of place
(a,)=f()  # still odd
[a]=f()   # looks like every other list

答案 4 :(得分:0)

左括号允许多行分配。例如,当从csv.reader()读取一行时,它会使代码更具可读性(如果效率更低),只需一次分配就可以将列表加载到命名变量中。

从括号开始可避免长行或\转义行。

(a, b, c) = [1, 2, 3]

(想象一下变量名称越来越长)

相关问题