C不保证任何评估顺序所以如下语句f(g1()+g2(), g3(), g4())可能会执行g1(),g2(),g3(),和g4()以任意顺序(虽然f()会后,所有的人都被执行)
那Python怎么样?我对Python 2.7的实验表明,它似乎是从左到右的评估顺序,但我想知道是否指定了这种情况.
测试程序:
def somefunc(prolog, epilog):
print prolog
def f(a, b, *args):
print epilog
return f
def f(text):
print text
return 1
somefunc('f1','f2')(f('hey'),f('ho'),f('hahaha'),f('tweedledee')+f('tweedledum'))
Run Code Online (Sandbox Code Playgroud)
打印
f1
hey
ho
hahaha
tweedledee
tweedledum
f2
Run Code Online (Sandbox Code Playgroud) 假设我有
def foo(n):
print("foo",n)
def bar(n):
print("bar",n)
print("Hello",foo(1),bar(1))
Run Code Online (Sandbox Code Playgroud)
我希望输出是:
Hello
foo 1 None
bar 1 None
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了令我惊讶的东西:
foo 1
bar 1
Hello None None
Run Code Online (Sandbox Code Playgroud)
为什么Python在打印“Hello”之前先调用函数?似乎打印“Hello”,然后调用foo(1),让它打印其输出,然后打印“None”作为它的返回类型更有意义。然后调用bar(1)并打印该输出,并打印“None”作为它的返回类型。Python(或者其他语言)以这种方式调用函数而不是按照每个参数出现的顺序执行它们,是否有原因?
编辑:现在,我的后续问题是,如果 Python 从左到右计算表达式,它会以某种方式临时存储每个参数的返回值,内部发生了什么?例如,现在我知道它将从左到右评估每个表达式,但最后一行说Hello None None,那么 Python 是否以某种方式从每个函数的执行中记住第二个参数和第三个参数的返回值为None?例如,在计算 时foo(),它会打印foo 1然后没有返回语句,那么它是否存储在foo没有返回值的内存中?
对于带有多个参数的print(),我认为它会逐一评估它们.但是,以下代码
a = [1, 2, 3, 4]
print(a, a[:], a.pop(), a, a[:])
Run Code Online (Sandbox Code Playgroud)
版画
[1, 2, 3] [1, 2, 3, 4] 4 [1, 2, 3] [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
我以为蟒蛇将评估a第一,然后a[:],然后a.pop(),再a和a[:]再次,这将打印
[1, 2, 3, 4] [1, 2, 3, 4] 4 [1, 2, 3] [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
那究竟是如何运作的呢?