[英]What is the Pythonic way to avoid reference before assignment errors in enclosing scopes?
我說的是一般情況。 這是一個例子:
c = 1
def a():
def b():
print(c)
b()
c = 2
a()
此代碼將返回以下錯誤: NameError: free variable 'c' referenced before assignment in enclosing scope
。 雖然邏輯假設是輸出應為1
。 什么是Pythonic解決這個問題的方法? 使用global
或非nonlocal
語句(我不喜歡)? 也許只是避免這種情況,多個范圍共享具有相同名稱的變量?
將其作為參數傳遞
當傳遞外部變量作為參數時,避免重復使用名稱,除非此變量不可能將任何其他變量作為參數處理,然后它並不重要,否則如果您下次傳遞d
並執行操作將會造成混淆在函數內的c
。
其次,當作為變量傳遞時,即使將名稱從param
更改為c
(它具有非常小的含義) , c
的值 也不會在函數內被修改,因為它不被視為全局變量,即使變量是對象它也是如此除非您將其傳遞給類,否則它將只是此函數中的對象。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.