加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 12:02:18 所属栏目:Python 来源:网络整理
导读:让我说我有 def foo(n): print("foo",n)def bar(n): print("bar",n)print("Hello",foo(1),bar(1)) 我希望输出为: Hellofoo 1 Nonebar 1 None 但相反,我得到的东西让我感到惊讶: foo 1bar 1Hello None None 为什么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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读