调用print语句中的函数的Python顺序?

让我说我有

def foo(n):
    print("foo",n)

def bar(n):
    print("bar",n)

print("Hello",foo(1),bar(1))

我希望输出为:

Hello
foo 1 None
bar 1 None

但相反,我得到的东西让我感到惊讶:

foo 1
bar 1
Hello None None

为什么Python在打印“Hello”之前首先调用函数?打印“Hello”似乎更有意义,然后调用foo(1),让它打印输出,然后打印“None”作为返回类型.然后调用bar(1)并打印该输出,并打印“None”作为返回类型. Python(或其他语言)是否有理由以这种方式调用函数而不是按照它们出现的顺序执行每个参数?

编辑:现在,我的后续问题是内部发生了什么,如果从左到右评估表达式,Python会以某种方式临时存储每个参数的返回值?例如,现在我理解它将从左到右评估每个表达式,但最后一行表示Hello None None,因此Python在某种程度上记住了每个函数的执行,第二个参数和第三个参数的返回值为None?例如,当评估foo()时,它会打印foo 1然后点击no return语句,那么它是否存储在内存中foo没有返回值?

最佳答案 引自
documentation

Python evaluates expressions from left to right. Notice that while evaluating an assignment, the right-hand side is evaluated before the left-hand side.

大胆强调我的.因此,首先评估所有表达式,然后将其传递给print.

观察打印调用的字节代码:

  1           0 LOAD_NAME                0 (print)
              3 LOAD_CONST               0 ('Hello')
              6 LOAD_NAME                1 (foo)
              9 LOAD_CONST               1 (1)
             12 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             15 LOAD_NAME                2 (bar)
             18 LOAD_CONST               1 (1)
             21 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             24 CALL_FUNCTION            3 (3 positional, 0 keyword pair)
             27 RETURN_VALUE

首先调用foo(LINE 12)和bar(LINE 21),然后打印(LINE 24 – 3位置args).

至于存储这些中间计算值的位置的问题,即call stack.print只需将它们从堆栈中弹出即可访问返回值. – Christian Dean

点赞