Python中的多重赋值方法

时间:2010-02-06 02:55:58

标签: python syntax variable-assignment

我正在努力为计算机科学的未来做准备,所以我从ECMAScript入手,现在我正在努力学习更多有关Python的知识。来自ECMAScript,看到a, b, c = 1, 2, 3之类的多个任务让我感到困惑,直到我意识到有多个任务正在进行。为了让事情更清楚一点,我真的很想做(a, b, c) = (1, 2, 3),但我不确定这是否会成为可衡量的性能影响。根据我的理解,元组本质上是多个任务无论如何都有效,但世界上有很多奇怪的东西,所以我尽量不去做任何事情。

提前致谢

4 个答案:

答案 0 :(得分: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        
>>> 

请参阅?那些完全冗余的括号与生成和执行的字节码完全相同 no - 就像说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        
>>> 

六对冗余括号(或任何数字,真的)仍然产生完全相同的代码。一旦你留下明显的最小数量的冗余括号(根本没有:它们是多余的,毕竟;-),正好哪里你会停止吗? - )为什么那里,什么时候它是“免费的”再添加一对...或两个......或三个......? - )

答案 1 :(得分:11)

它不应该对性能产生任何影响。括号不会使它成为元组,逗号就是这样。所以(1,2,3)与1,2,3

完全相同

答案 2 :(得分:2)

它也适用于列表:

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

同样适用

答案 3 :(得分:1)

据我所知,多重赋值是作为元组打包和元组解包的组合实现的,所以它应该具有相同的效果。