python列表和元组文字中的评估顺序

szl*_*zli 10 python

假设我们有这样的事情:

a = (fcn1(), fcn2())
b = [fcn1(), fcn2()]
Run Code Online (Sandbox Code Playgroud)

Python解释器fcn1()之前是否进行了评估fcn2(),或者订单是否未定义?

Ash*_*ary 8

它们从左到右进行评估.

文档(列表):

当提供以逗号分隔的表达式列表时,其元素将从左到右进行计算,并按该顺序放入列表对象中.

小测试使用dis.dis():

In [208]: def f1():pass

In [209]: def f2():pass

In [210]: import dis

In [212]: def func():

        a = (f1(), f2())
        b  = [f1(), f2()]
       .....:     

In [213]: dis.dis(func)
  2           0 LOAD_GLOBAL              0 (f1)
              3 CALL_FUNCTION            0
              6 LOAD_GLOBAL              1 (f2)
              9 CALL_FUNCTION            0
             12 BUILD_TUPLE              2
             15 STORE_FAST               0 (a)

  3          18 LOAD_GLOBAL              0 (f1)
             21 CALL_FUNCTION            0
             24 LOAD_GLOBAL              1 (f2)
             27 CALL_FUNCTION            0
             30 BUILD_LIST               2
             33 STORE_FAST               1 (b)
             36 LOAD_CONST               0 (None)
             39 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

注意:如果分配,则首先评估右侧.

  • 标准Python解释器也是如此.但是*要求*是真的吗? (2认同)