亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不明白為什么發生UnboundLocalError

不明白為什么發生UnboundLocalError

RISEBY 2019-05-27 13:49:28
不明白為什么發生UnboundLocalError 我在這做錯了什么?counter = 0def increment():   counter += 1increment()上面的代碼拋出了一個UnboundLocalError。
查看完整描述

4 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

Python沒有變量聲明,因此必須弄清楚變量本身的范圍。它通過一個簡單的規則來實現:如果對函數內部的變量賦值,則該變量被視為本地變量。[1] 因此,這條線

counter += 1

隱含地使counter本地化increment()。但是,嘗試執行此行將嘗試counter在分配之前讀取局部變量的值,從而產生一個UnboundLocalError。[2]

如果counter是全局變量,global關鍵字將有所幫助。如果increment()是本地函數和counter局部變量,則可以nonlocal在Python 3.x中使用。


查看完整回答
反對 回復 2019-05-27
?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

您需要使用全局語句,以便修改全局變量計數器,而不是局部變量:

counter = 0def increment():
  global counter
  counter += 1increment()

如果counter定義的封閉范圍不是全局范圍,則在Python 3.x上可以使用非本地語句。在Python 2.x的相同情況下,您將無法重新分配到非本地名稱counter,因此您需要進行counter可變并修改它:

counter = [0]def increment():
  counter[0] += 1increment()print counter[0]  # prints '1'


查看完整回答
反對 回復 2019-05-27
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

要回答主題中的問題,*是,Python中有閉包,除了它們只適用于函數內部,并且(在Python 2.x中)它們是只讀的; 您無法將名稱重新綁定到其他對象(但如果該對象是可變的,則可以修改其內容)。在Python 3.x中,您可以使用nonlocal關鍵字來修改閉包變量。

def incrementer():
    counter = 0
    def increment():
        nonlocal counter
        counter += 1
        return counter    return increment

increment = incrementer()increment()   # 1increment()   # 2

*原始問題的標題詢問了Python中的閉包。


查看完整回答
反對 回復 2019-05-27
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

您的代碼拋出的UnboundLocalError原因已經在其他答案中得到了很好的解釋。

但在我看來,你正試圖建立一些類似的東西itertools.count()。

那你為什么不嘗試一下,看看它是否適合你的情況:

>>> from itertools import count>>> counter = count(0)>>> counter
count(0)>>> next(counter)0>>> counter
count(1)>>> next(counter)1>>> counter
count(2)


查看完整回答
反對 回復 2019-05-27
  • 4 回答
  • 0 關注
  • 2024 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號