2013-05-03 41 views
4

我在談論一般情況。這裏有一個例子:在封閉範圍內賦值錯誤之前避免引用的Pythonic方法是什麼?

c = 1 
def a(): 
    def b(): 
     print(c) 
    b() 
    c = 2 

a() 

此代碼將返回以下錯誤: NameError: free variable 'c' referenced before assignment in enclosing scope。雖然邏輯假設是輸出應該是1。這個問題的Pythonic解決方案是什麼?使用globalnonlocal語句(我不喜歡)?也許只是避免這種情況,多個範圍共享具有相同名稱的變量?

+0

避免它,或者它作爲參數傳遞。調用'a()'時調用'a(c)'。要麼或使用全球。 – Torxed 2013-05-03 16:17:45

+4

使用體面的變量名稱?避免使用全局變量?避免這麼多嵌套?老實說,我自己從來沒有遇到過這個問題,這不應該是一個常見問題。 – 2013-05-03 16:18:54

回答

5


將它作爲一個參數

時,順便外變量作爲參數,避免重複使用名稱,除非它是不可能的,這個變量可以處理任何其它變量作爲參數,那麼它並不真正的問題否則如果您下次通過d,並且您在該功能內執行了c操作,將會引起混淆。

其次,c值將不能獲得功能內被修改,即使從param改變名稱c(它意義不大)傳遞一個變量時,因爲它不被視爲一個全球性的varaible ,即使這個變量是一個對象,它只會是這個函數中的一個對象,除非你將它傳遞給一個類。

c = 1 
def a(param): 
    def b(): 
     print(param) 
    b() 
    param = 2 

a(c) 

你需要堅持全局選項,如果你不想把它作爲一個參數傳遞,你還是要影響c之外的功能。 全球選項影響「外部」C變量,因爲你想它..但這並不真正被認爲是最佳實踐,儘可能狂熱它。

c = 1 
def a(): 
    global c 
    def b(): 
     print(c) 
    b() 
    c = 2 

a() 

這裏就是我會建議:

c = 1 
def a(param): 
    def b(): 
     print(param) 
    b() 
    param = 2 
    return param 

c = a(c) 

甚至:

c = 1 
def b(param): 
    print(param) 
def a(param): 
    b(param) 
    param = 2 
    return param 

c = a(c) 
+0

另一個推薦是儘可能避免嵌套函數。在Python中,根本就不需要擁有它們。如果想要對同一個變量執行不同的函數,或者只需要兩個單獨的函數,就可以輕鬆地調用它們,建立一個類。 – Torxed 2013-05-03 16:27:56

相關問題