2013-07-01 55 views
1

中打印語句的順序爲什麼第一個打印語句不給我'5 = 3'?這是John Guttag的書。不能讓我的頭靠近它。範圍混亂。無法解釋o/p

它看起來像這樣的方式:

3 = 4 
2 = 4 
1 = abc 
4 = 4 
5 = 3 
6 = <function g at 0x026B22F0> 
1 = abc 

腳本:

def f(x): 
    def g(): 
     x = 'abc' 
     print '1 =',x 
    def h(): 
     z = x 
     print '2 =',z 
    x = x+1 
    print '3 =',x 
    h() 
    g() 
    print '4 =', x 
    return g 

x = 3 
z = f(x) 

print '5 =',x 
print '6 =',z 
z() 
+6

修復您的縮進 – simonzack

+0

它給您帶來了什麼? –

回答

1

定義一個函數不會執行它,所以在定義f之後,執行x=3。調用函數f(x)並將結果分配給z。

在調用f(x)期間,定義了兩個函數,然後執行x=x+1。所以第一印刷聲明是3 = 4

這應該足以幫助您找出其餘的問題。

+0

我沒有意識到在'z = f(x)中調用f(x)會執行該函數。但是現在我可以看到,一旦f(x)被調用,它必須打印f函數體內的內容。謝謝。 – COOLBEANS

0

From Python docs

全局聲明是適用於整個當前代碼塊的聲明。這意味着列出的標識符將被解釋爲全局變量。如果沒有全局變量,將不可能分配一個全局變量,儘管自由變量可能會引用全局變量而不被聲明爲全局變量。

例如,g功能應該是這樣的,如果我們的目標是改變全球x

def g(): 
    global x 
    x = 'abc' 
    print '1 =',x 
1

所有你做x的變化僅限於功能f的局部範圍。除非您聲明x全局(global x),否則x將不會在全局空間中從3更改。

0

因爲您在獲得第一個頂級打印語句之前調用f(x),所以第一個打印語句是在f中執行的第一個語句。這解釋了與表面詞彙順序的所有偏差。

+0

這解釋得很好。我沒有意識到這個調用會執行這個函數,但是一旦我想到它,它就有意義了。謝謝 – COOLBEANS