多重赋值语义

问题描述 投票:0回答:5

在 Python 中可以做到:

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

我使用

dis
检查了生成的字节码,它们是相同的。
那么为什么要允许这样做呢?我需要其中之一而不是其他吗?


另请参阅Python 中的多重赋值和求值顺序,了解此类赋值的基本语义。

另请参阅了解 Python 交换:为什么 a, b = b, a 并不总是等于 b, a = a, b? 对于更复杂的情况,其中赋值顺序很重要。

python variable-assignment
5个回答
75
投票

需要在作业左侧包含更多结构的一种情况是,当您要求 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

这在过去被证明对我很有用,例如,当使用 enumerate 迭代 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')

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)

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


4
投票

当解压单元素可迭代时,列表语法更漂亮:

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

2
投票

它们也是相同的,因为赋值是从右到左进行的,在右侧,您有一种类型,它是两个元素的序列。当进行赋值调用时,序列被解包并查找相应的元素来匹配并赋予这些值。 是的,在这种情况下,将序列解压缩到各个元素,任何一种方法都应该没问题。


0
投票

左括号允许多行赋值。例如,当从

csv.reader()
读取一行时,通过一次赋值将列表加载到命名变量中,可以使代码更具可读性(如果效率较低)。

以括号开头可避免过长或

\
转义行。

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

(想象更多更长的变量名)

© www.soinside.com 2019 - 2024. All rights reserved.