Python中的多重赋值方法

8 投票
4 回答
4072 浏览
提问于 2025-04-15 18:57

我正在为未来的计算机科学学习做准备,所以我从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 是完全一样的。

撰写回答