1. 程式人生 > >嵌套函數局部變量修改問題

嵌套函數局部變量修改問題

語句 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

嵌套函數局部變量修改問題