一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python中 Global和Nonlocal的用法詳解

Python中 Global和Nonlocal的用法詳解

2020-04-11 10:55叉叉敵 Python

global關鍵字用來在函數或其他局部作用域中使用全局變量, nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數內的變量。這篇文章主要介紹了Python中 Global和Nonlocal的用法,需要的朋友可以參考下

nonlocal 和 global 也很容易混淆。簡單記錄下自己的理解。

解釋

global

總之一句話,作用域是全局的,就是會修改這個變量對應地址的值。

global 語句是一個聲明,它適用于整個當前代碼塊。 這意味著列出的標識符將被解釋為全局變量。 盡管自由變量可能指的是全局變量而不被聲明為全局變量。

global 語句中列出的名稱不得用于該全局語句之前的文本代碼塊中。

global 語句中列出的名稱不能定義為形式參數,也不能在 for 循環控制目標、 class 定義、函數定義、 import 語句或變量注釋中定義。

當前的實現并不強制執行這些限制,但是程序不應該濫用這種自由,因為未來的實現可能會強制執行這些限制,或者悄悄地改變程序的含義。

程序員注意: global 是指向解析器的指令。 它僅適用于與全局語句同時解析的代碼。 特別是,包含在提供給內置 exec() 函數的字符串或代碼對象中的全局語句不會影響包含函數調用的代碼塊,而且這種字符串中包含的代碼不會受包含函數調用的代碼中的全局語句的影響。 eval() 和 compile() 函數也是如此。

Python中 Global和Nonlocal的用法詳解

一、global

1、global關鍵字用來在函數或其他局部作用域中使用全局變量。但是如果不修改全局變量也可以不使用global關鍵字。

?
1
2
3
4
5
gcount = 0
def global_test():
  gcount+=1
  print (gcount)
global_test()

以上代碼會報錯:第一行定義了全局變量,在內部函數中又對外部函數進行了引用并修改,那么python會認為它是一個局部變量,有因為內部函數沒有對其gcount進行定義和賦值,所以報錯。

2、如果局部要對全局變量修改,則在局部聲明該全局變量

?
1
2
3
4
5
6
gcount = 0
def global_test():
  global gcount
  gcount+=1
  print (gcount)
global_test()

以上輸出為:1

3、如果局部不聲明全局變量,并且不修改全局變量,則可以正常使用

?
1
2
3
4
gcount = 0
def global_test():
  print (gcount)
global_test()

以上輸出為:0

 二、nonlocal

 nonlocal

只在閉包里面生效,作用域就是閉包里面的,外函數和內函數都影響,但是閉包外面不影響。

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

nonlocal 語句中列出的名稱與 global 語句中列出的名稱不同,它們必須引用封閉范圍中已經存在的綁定(無法明確確定應在其中創建新綁定的范圍)。

1、 nonlocal聲明的變量不是局部變量,也不是全局變量,而是外部嵌套函數內的變量

?
1
2
3
4
5
6
7
8
9
10
11
12
13
def make_counter():
  count = 0
  def counter():
    nonlocal count
    count += 1
    return count
  return counter  
def make_counter_test():
 mc = make_counter()
 print(mc())
 print(mc())
 print(mc())
make_counter_test()

  以上輸出為:

1

2

3

三、混合使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def scope_test():
  def do_local():
    spam = "local spam" #此函數定義了另外的一個spam字符串變量,并且生命周期只在此函數內。此處的spam和外層的spam是兩個變量,如果寫出spam = spam + “local spam” 會報錯
  def do_nonlocal():
    nonlocal spam    #使用外層的spam變量
    spam = "nonlocal spam"
  def do_global():
    global spam
    spam = "global spam"
  spam = "test spam"
  do_local()
  print("After local assignmane:", spam)
  do_nonlocal()
  print("After nonlocal assignment:",spam)
  do_global()
  print("After global assignment:",spam)
 
scope_test()
print("In global scope:",spam)

以上輸出為:

After local assignmane: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

總結

以上所述是小編給大家介紹的Python中 Global和Nonlocal的用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

原文鏈接:https://segmentfault.com/a/1190000021625267

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品国产影院 | 精品女同同性视频很黄很色 | 国产精品免费 | 4tube高清性欧美 | 超91精品手机国产在线 | 美女脱了内裤打开腿让人羞羞软件 | 国产精品久久久久网站 | 美女露鸡鸡| 天天舔天天干 | 国产精品视频播放 | 国产高清一区二区 | 日韩成片 | 国产xx肥老妇视频奂费 | 99av导航| 波多野结衣中文字幕在线 | 精品国产欧美精品v | 午夜国产在线视频 | 午夜视频一区二区三区 | 日本乱子| 国产成人精品高清不卡在线 | 色悠久久久久综合网小说 | 三叶草私人研究所 | 99这里都是精品 | 欧美又大又粗又长又硬 | 欧美裸妇| porono日本动漫 | 极品丝袜乱系列在线阅读 | 欧美二区三区 | 青青青国产在线观看 | 国产一区二区精品久 | 四虎在线精品免费高清在线 | 亚洲国产精品成人综合久久久 | 无码AV熟妇素人内射V在线 | www.男人的天堂 | 香蕉在线精品一区二区 | 国产成人精品一区二三区在线观看 | 成人人免费夜夜视频观看 | 日本黄大片影院一区二区 | 9色视频在线观看 | 国产一区在线播放 | 亚洲午夜久久久久国产 |