【问题标题】:Method of Multiple Assignment in PythonPython中的多重赋值方法
【发布时间】:2010-02-06 02:55:58
【问题描述】:

我正在努力为计算机科学的未来做准备,所以我从 ECMAScript 开始,现在我正在尝试更多地了解 Python。来自 ECMAScript,看到多个作业,例如 a, b, c = 1, 2, 3,让我一时不知所措,直到我意识到有多个作业正在进行。为了让事情更清楚一点,我真的很想做(a, b, c) = (1, 2, 3),但我不确定这是否会对性能产生可衡量的影响。据我了解,元组本质上是多个分配的工作方式,但世界上有很多奇怪的东西,所以我尽量不要假设任何事情。

提前致谢

【问题讨论】:

  • 这是对您在计算机科学领域未来的提示(我从事该行业已有 30 多年)。在您能够证明多重赋值语句绝对会扼杀您的程序之前,不要将时间花在此类优化问题上。直到你有证明某些东西慢得不能接受,使用它。使用一切而不必担心性能。发明这种语言的人已经为你担心了。

标签: python syntax variable-assignment


【解决方案1】:

使用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        
>>> 

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

【讨论】:

    【解决方案2】:

    它不应该对性能产生任何影响。括号不会使它成为一个元组,逗号可以。所以 (1,2,3) 和 1,2,3 完全一样

    【讨论】:

    • 啊...我什至没有想到这一点。谢谢。
    【解决方案3】:

    它也适用于列表:

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

    同样有效

    【讨论】:

    • 它在python中被称为“解包”
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-30
      • 2019-02-27
      • 1970-01-01
      • 2023-03-04
      • 2018-08-13
      • 2014-04-12
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多