嵌套函數局部變量修改問題
阿新 • • 發佈:2019-03-25
語句 python 2 一個bug enc code cal urn lob oca
今天在寫一個簡單的嵌套函數時,需要在f2()
中修改上層函數f1()
的局部變量
def f1():
i=1
def f2():
i=i+1
return f2()
程序報錯
UnboundLocalError: local variable ‘i‘ referenced before assignment
一查,大概是局部變量作用域的問題
f2 在 f1 之內,其作用域的範圍等同於閉包,因此 x 實際上是在父函數 f1的作用域內,f2調用它類似於 f1調用全局變量,只能讀取而不能直接改寫 x。
但是如果你使用列表對象的 x,則 x[0] 並非 x對象 ,而是 x 的元素,因此可以被改寫。
def f1():
i=[1]
def f2():
i[0]=i[0]+1
return f2()
其實這是 python 2 的一個bug,在 python 3 中引入了 nonlocal
語句,其類似於 global
語句,只不過是用來聲明某個變量是父函數的那個變量,以便於子函數可以直接改寫該變量。
在python 2 中,只有用列表對象了,不過在 python 3 中可以這麽寫:
def f1(): i=1 def f2(): nonlocal i #加上這一句聲明這裏的 i 是父函數的 i,之後便可以直接改寫 i i=i+1
嵌套函數局部變量修改問題