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

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

為什么Python的非本地關鍵字不像全局范圍一樣?

為什么Python的非本地關鍵字不像全局范圍一樣?

開心每一天1111 2021-03-15 09:10:08
在Python 3.3.1中,這有效:i = 76def A():    global i    i += 10print(i) # 76A()print(i) # 86這也適用:def enclosing_function():    i = 76    def A():        nonlocal i        i += 10    print(i) # 76    A()    print(i) # 86enclosing_function()但這不起作用:i = 76def A():    nonlocal i # "SyntaxError: no binding for nonlocal 'i' found"    i += 10print(i)A()print(i)nonlocal關鍵字狀態的文檔(添加了重點):非本地語句使列出的標識符引用最近的封閉范圍中的先前綁定的變量。在第三個示例中,“最近封閉范圍”恰好是全局范圍。那為什么不起作用呢?請閱讀此位我確實注意到文檔繼續說明(強調):[ nonlocal]語句允許封裝的代碼在全局(模塊)范圍之外的本地范圍之外重新綁定變量。但是,嚴格來說,這并不意味著我在第三個示例中所做的不起作用。
查看完整描述

3 回答

?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

名稱的搜索順序為LEGB,即本地,封閉,全局,內置。因此,全局范圍不是封閉范圍。

編輯

從文檔:

非本地語句使列出的標識符引用最近的封閉范圍中的先前綁定的變量。這很重要,因為綁定的默認行為是首先搜索本地名稱空間。該語句允許封裝的代碼在全局(模塊)作用域之外的本地作用域之外重新綁定變量。


查看完整回答
反對 回復 2021-03-29
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

答案是全局范圍不包含任何內容-它對所有內容都是全局的。global在這種情況下,請使用關鍵字。


查看完整回答
反對 回復 2021-03-29
?
慕無忌1623718

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

為什么將模塊的作用域視為全局作用域而不是封閉的作用域?它對于其他模塊仍然不是全局的(嗯,除非您這樣做了from module import *),對嗎?

如果您在的名稱module空間中添加了一些名稱;它在使用的任何模塊中都是可見的,module即,它在整個Python過程中都是全局的。

通常,您的應用程序應使用盡可能少的可變全局變量。請參閱為什么全局變量不好?:

  • 非地區性

  • 無訪問控制或約束檢查

  • 隱式耦合

  • 并發問題

  • 命名空間污染

  • 測試與禁閉

因此,如果nonlocal允許偶然創建全局變量將是不好的。如果要修改全局變量;您可以global直接使用關鍵字。

  • global 是最具破壞性的:可能會影響程序中模塊的所有使用

  • nonlocal 破壞性較小:受external()函數作用域的限制(在編譯時檢查綁定)

  • 沒有聲明(局部變量)是破壞性最小的選項:受inner()函數作用域的限制

您可以nonlocal在《PEP:3104訪問外部范圍中的名稱》中了解其背后的歷史和動機。


查看完整回答
反對 回復 2021-03-29
  • 3 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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