Python中的多重赋值方法
我正在为未来的计算机科学学习做准备,所以我从ECMAScript开始,现在想学习更多关于Python的知识。刚开始接触Python时,看到像 a, b, c = 1, 2, 3
这样的多重赋值让我有点困惑,直到我意识到其实是在同时给多个变量赋值。为了让事情更清楚一些,我想用 (a, b, c) = (1, 2, 3
这样的方式来赋值,但我不确定这样做会不会影响性能。从我了解的情况来看,元组就是用来处理多重赋值的,不管怎样,但这个世界上有很多奇怪的事情,所以我尽量不做假设。
提前谢谢你们!
4 个回答
2
这个方法同样适用于列表:
a, b, c = [1, 2, 3]
效果也是一样的好
13
检查这个问题非常简单,可以使用dis
模块:
>>> import dis
>>> dis.dis(compile('a,b,c=1,2,3','','exec'))
1 0 LOAD_CONST 4 ((1, 2, 3))
3 UNPACK_SEQUENCE 3
6 STORE_NAME 0 (a)
9 STORE_NAME 1 (b)
12 STORE_NAME 2 (c)
15 LOAD_CONST 3 (None)
18 RETURN_VALUE
>>> dis.dis(compile('(a,b,c)=(1,2,3)','','exec'))
1 0 LOAD_CONST 4 ((1, 2, 3))
3 UNPACK_SEQUENCE 3
6 STORE_NAME 0 (a)
9 STORE_NAME 1 (b)
12 STORE_NAME 2 (c)
15 LOAD_CONST 3 (None)
18 RETURN_VALUE
>>>
看到了吗?那些完全多余的括号对生成和执行的字节码没有任何影响——就像a+b和(a+b)生成和执行的字节码是完全一样的。所以,如果你喜欢加上多余的括号,随便你——阅读你代码的人可能不喜欢这些括号,但那些只是执行代码的人根本不会注意到。只不过,为什么只停留在两对多余的括号呢?看看,
>>> dis.dis(compile('(((a,b,c)))=(((1,2,3)))','','exec'))
1 0 LOAD_CONST 4 ((1, 2, 3))
3 UNPACK_SEQUENCE 3
6 STORE_NAME 0 (a)
9 STORE_NAME 1 (b)
12 STORE_NAME 2 (c)
15 LOAD_CONST 3 (None)
18 RETURN_VALUE
>>>
六对多余的括号(或者实际上任何数量的括号)仍然会生成完全相同的代码。一旦你超过了明显的最小数量的多余括号(根本没有:它们毕竟是多余的;-),那么你究竟应该在哪里停下来呢?-) 而且为什么要在那个地方停下来,当再加一对……或者两对……或者三对都是“免费的”呢?-)
11
这对性能没有任何影响。括号并不会让它变成一个元组,逗号才是关键。所以 (1,2,3) 和 1,2,3 是完全一样的。