2010-06-01 140 views
1

我知道LEGB規則。但是,一個函數是否具有對封閉函數中定義的變量的讀取訪問權限的簡單測試看起來並不實際。即:爲什麼我的函數不能在封閉函數中訪問變量?

#!/usr/bin/env python2.4 
'''Simple test of Python scoping rules''' 

def myfunction(): 
    print 'Hope this works: '+myvariable 

def enclosing(): 
    myvariable = 'ooh this worked' 
    myfunction() 

if __name__ == '__main__': 
    enclosing() 

返回:

NameError: global name 'myvariable' is not defined 

難道我做錯了什麼?除了LEGB決議命令還有更多嗎?

+3

只是命名函數「enclosing」不會使它如此:) – 2010-06-01 09:27:10

+0

是的。我錯誤地認爲'包含'包含的調用函數,但它實際上是指嵌套函數的父項。 – mikemaccana 2010-06-01 09:44:45

+0

沒有必要恢復有效的標籤。這不是關於你,而是關於這個問題。 – SilentGhost 2010-06-01 09:46:00

回答

2

你可以...

,如果你這樣做是這樣的:

#!/usr/bin/env python2.4 
'''Simple test of Python scoping rules''' 

def enclosing(): 
    myvariable = 'ooh this worked' 

    def myfunction(): 
     print 'Hope this works: ' + myvariable 

    myfunction() 

if __name__ == '__main__': 
    enclosing() 

...否則你的函數不知道去哪裏找(也確實如此,但它看起來在全局變量,這就是爲什麼你會收到錯誤的原因)(如果你不能將函數定義爲嵌套函數,則將其作爲參數傳遞)

+0

(如果你想*分享*一個變量,你可以添加「全球」關鍵字到這兩個函數,使他們共享一個全局變量,但我會強烈**建議不要做這樣的事情,除非絕對必要) – 2010-06-01 09:29:09

+0

(即「全球myvariable」到兩個函數的開頭) – 2010-06-01 09:29:53

+0

謝謝特倫斯。似乎我錯誤地認爲調用函數被認爲是「封閉的」,但該術語專指嵌套函數的父代。 – mikemaccana 2010-06-01 09:34:01

相關問題