2015-01-15 216 views
1

這裏是我的測試腳本:訪問全局函數的變量在局部函數

def main(): #global 
    n = 1 
    z = None 

    def addone(): #local 
     if not z: 
      n = n+1 
    addone() 
    print n 

main() 

我步入addone()功能,一旦它擊中主叫用戶線。 此時我只能看到變量z,但看不到n

現在,如果n被賦值之前,應該不是z

同樣,如果我將n=n+1更改爲z='hi',我不能再看到z!這與我以前關於本地/全局功能的所有信念相反!你知道得越多,你知道的就越不瞭解Python。

問題(S):

  • 爲什麼我能看到一個而不是其他?

  • 我想預先將global添加到我想重新分配的這些變量中嗎?

+0

也許這可能會有所幫助:http://stackoverflow.com/a/21978980/748858 – mgilson

+0

啊哈,確實有用。謝謝。我原以爲我不得不在功能之外使用'global',但是我可以在內部使用它。 – tenwest

+0

等待...也許這是我想的。不需要在功能的外部**定義'global'?我得到一個'NameError:全局名'x'未定義'。在函數之外調用它'global'並且使其工作。 – tenwest

回答

1

最好的解決方案是升級到Python 3並在內部函數nonlocal n中使用。第二,最好的,如果你絕對必須堅持與Python 2:

def main(): #global 
    n = [1] 
    z = None 

    def addone(): #local 
     if not z: 
      n[0] += 1 
    addone() 
    print n[0] 

main() 

像往常一樣,「有計算機科學沒問題,不能用額外的間接水平來解決」。通過使n成爲一個列表(並且始終使用和分配n[0]),您在某種意義上正確地介紹了救命「額外間接級別」。

+0

不幸的是我受限於python2 ...這是一個非常有趣的解決方法,我現在可能會使用它,因爲我不認爲我們想要將有問題的變量聲明爲'global'。 – tenwest

+0

@tenwest,是的,只要有可能就應該避免使用'global'! –

0

好的,經過一些測試後,我意識到這一切都與變量的重新分配有關。

例如:

def main(): #global 
    n = 1 
    z = None 

    def addone(): #local 
     if not z: 
      x = n+1 
    addone() 
    print n 

main() 

現在同時顯示nz當我的addone()函數內。這是因爲我不再試圖重新分配n,這對我來說是有意義的,以便保護全局變量免受操縱,如果碰巧在本地函數中使用了類似的名稱。