多分配语义
在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名越来越长)