1

次のコードがあるとします。

def square(x):
    print ("Just before square returns")
    for k in dir():
        print ("{0} -------> {1}".format(k, eval(k)))
    return x*x
def cube(x):
    print ("Just before cube returns")
    for k in dir():
        print ("{0} -------> {1}".format(k, eval(k)))
    return x*x*x

x = 5
print ("cube(square({0})) = {1}".format(x, cube(square(x))))
print ("Just before main returns")
for k in dir():
    print ("{0} -------> {1}".format(k, eval(k)))

このコードを実行すると、次のことが明らかになります

Just before square returns
x -------> 5
Just before cube returns
x -------> 25
cube(square(5)) = 15625
Just before main returns
__builtins__ -------> <module 'builtins' (built-in)>
__cached__ -------> None
__doc__ -------> None
__file__ -------> exampleOne.py
__name__ -------> __main__
__package__ -------> None
cube -------> <function cube at 0x1037b78>
square -------> <function square at 0x1037af0>
x -------> 5

私たちは当惑しています。square 関数が最初にスタックにプッシュされ、その戻り値が計算され、cube 関数に渡されますか? もう 1 つの可能性は、cube 関数が最初に呼び出され、次に引数を解決するプロセスで square 関数を呼び出す必要があることです。何を教えていただけますか?これはコンパイラまたは言語に依存しますか?

4

3 に答える 3

1

最も内側が常に最初に評価されます。つまり、スタックに配置されるのは最後です。

この例を見てください:

>>> def func():
        def func1():
            print (1)
        def func2(x):
            print (2)
        def func3(y):
            print (3)
        func3(func2(func1()))


>>> func()
1                         #func1() was called first
2                         #then func2()   
3                         #last is func3() 

使用dis.dis()

>>> dis.dis(func)
  2           0 LOAD_CONST               1 (<code object func1 at 0xb76aa770, file "<pyshell#19>", line 2>)
              3 MAKE_FUNCTION            0
              6 STORE_FAST               0 (func1)

  4           9 LOAD_CONST               2 (<code object func2 at 0x8a10530, file "<pyshell#19>", line 4>)
             12 MAKE_FUNCTION            0
             15 STORE_FAST               1 (func2)

  6          18 LOAD_CONST               3 (<code object func3 at 0x8a102f0, file "<pyshell#19>", line 6>)
             21 MAKE_FUNCTION            0
             24 STORE_FAST               2 (func3)

  8          27 LOAD_FAST                2 (func3)      #func3 is placed on stack
             30 LOAD_FAST                1 (func2)      #func2 gets placed on the stack
             33 LOAD_FAST                0 (func1)      #finally it's func1 that gets
                                                        # placed on stack
             36 CALL_FUNCTION            0
             39 CALL_FUNCTION            1
             42 CALL_FUNCTION            1
             45 POP_TOP                          #Removes the top-of-stack item.
             46 LOAD_CONST               0 (None)
             49 RETURN_VALUE        
于 2012-10-05T18:24:18.750 に答える
1
x= 0
def j(i):
     global x
     x+=2
     print (x)

     return i+1

def h(i):
     global x
     print (x)
     return i+1

print h(j(1))  \\prints 2,2,3

引数は渡される前に評価されます。物事が逆に起こるように書くことはおそらく可能ですが、非常に直感的ではないように見えるので、これを行う言語を知りません。

于 2012-10-05T18:19:33.627 に答える
1

もちろん、それは言語に依存する可能性がありますが、あなたの例は Python です。

Python では、関数の引数は、それらが引数である関数を呼び出す前に常に評価されます。(ドキュメンテーションを参照してください。)square(x)は の引数として渡されるため、最初cubesquareが呼び出され、次に結果が に渡されcubeます。つまり、式内の関数呼び出しは常に「内側から」評価され、最も内側の関数が最初に評価されます。これは、数式の評価の順序とまったく同じです (最も内側の括弧が最初)。

于 2012-10-05T18:11:52.680 に答える