在Python中可以这样做:
a, b = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2
我使用dis
检查了生成的字节码,它们是相同的。那么为什么要允许这样做呢?我是否需要其中之一而不是其他东西?
在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
这在我过去的经验中非常有用,例如,当使用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')
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)
似乎没有理由也允许使用方括号,而且很少有人这样做。
[...]=
的一个(甚至单一的)合理使用情况是什么?谢谢。 - eat当解包单个元素的可迭代对象时,使用列表语法更加美观:
a,=f() # comma looks out of place
(a,)=f() # still odd
[a]=f() # looks like every other list
它们也是相同的,因为赋值是从右到左进行的,在右侧,你只有一种类型,即由两个元素组成的序列。当进行赋值调用时,该序列将被拆包并查找相应的元素以匹配并赋予这些值。
在这种情况下,任何一种方式都可以,将序列解包到相应的元素中即可。
一个开括号允许多行赋值。例如,当从 csv.reader()
读取一行时,使用单个赋值将列表加载到命名变量中可以使代码更易读(如果不那么高效)。
从括号开始避免了长行或 \
转义行。
(a, b,
c) = [1, 2, 3]
(想象更多和更长的变量名)