多个赋值语义

Ail*_*lyn 66 python variable-assignment

在Python中,可以做到:

a, b   = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*hen 74

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

# 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
Run Code Online (Sandbox Code Playgroud)

事实证明,这对我来说很有用,例如,当使用枚举迭代一系列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')
Run Code Online (Sandbox Code Playgroud)

  • 更好:使用OrderedDict并且`i`将具有更多意义. (5认同)

Sve*_*ach 13

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

a = 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

相当于

a = (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

在某些情况下,您需要使用括号来解决歧义,例如,如果要将元组传递(1, 2)给函数f,则必须编写f((1, 2)).因为有时需要括号,所以总是允许它们保持一致性,就像你总是可以写(a + b)而不是a + b.

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

a, (b, c) = 1, (2, 3)
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,不是一个bug,但是当你说'只是想知道这个设计决定的理由'时,我也会对`[=] =`那么(甚至是单一的)合理用例感到好奇和困惑. ?.谢谢 (2认同)