12

假设我们有这样的事情:

a = (fcn1(), fcn2())
b = [fcn1(), fcn2()]

Python 解释器是在fcn1()之前求值fcn2(),还是未定义顺序?

4

2 回答 2

11

从左到右对它们进行评估。

来自文档(用于列表):

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

小测试使用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        

注意:在赋值的情况下,首先评估右手边。

于 2013-01-23T19:03:41.533 回答
3

表达式从左到右求值。此链接专门处理tuple此案。这是另一个专门处理列表案例的链接。

于 2013-01-23T19:04:39.563 回答