多分配语义

在Python中,可以这样做:

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

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

一种情况是,当你要求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 

这在过去被certificate对我有用,例如,当使用枚举遍历一个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') 

通常可以使用或不使用圆括号来编写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) 

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

它们也是一样的,因为赋值是从右到左发生的,你有一个types,它是两个元素的序列。 当进行调用调用时,序列被解压缩并查找相应的元素以匹配并赋予这些值。 是的,在这种情况下任何一种方式都应该罚款,其中的序列是解压到各自的元素。

左括号允许多行分配。 例如,当从csv.reader()读取一行时,它使得代码更具可读性(如果效率较低),将列表加载到具有单个赋值的命名variables中。

从括号开始避免长或\逃脱线。

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

(想象一下variables名越来越长)