日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

命名空间和作用域

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 命名空间和作用域 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,namespace

  • namespace是名字到對象的映射,python里面的大部分命名空間由字典實現。如果有性能問題,會更改。

  • 命名空間的舉例

    ?存放內置函數的集合(abs()這種函數,和內建的異常)
    ?模塊中的全局名稱
    ?函數調用中的局部名稱
    ?某種意義,對象的屬性集合
    不同命名空間的名稱沒得關系,比如兩個模塊里面都有show()函數,只要指明是哪個模塊就行。

  • 三種命名空間的區別
    ? 內置名稱(built-in names), Python 語言內置的名稱,比如函數名 abs、char 和異常名稱 BaseException、Exception 等等。

    ? 全局名稱(global names),模塊中定義的名稱,記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常量。

    ? 非局部和非全局之間得名稱 nonlocal

    ? 局部名稱(local names),函數中定義的名稱,記錄了函數的變量,包括函數的參數和局部定義的變量。(類中定義的也是)

    命名空間查找順序:(從小到大)
    假設我們要使用變量 BITQIAN,則 Python 的查找順序為:局部的命名空間去 -> 全局命名空間 -> 內置命名空間。
    如果找不到變量 BITQIAN,它將放棄查找并引發一個 NameError 異常:

int = 0 def test_namespace():int = 1def inner_show():int = 2print(int)inner_show()test_namespace() # 2 localdef test_namesapce():int = 1def inner_show():print(int) # 1 nonlocalinner_show()def test_namespace():def inner_show():print(int) # 0 global inner_show()del int def test_namespace():def inner_show():print(int) # class<int> built-ininner_show()
  • 命名空間的生命周期
    1,不同時刻創建的命名空間有不同的生命周期,包含內置名稱的命名空間(builtins)是在python解釋器啟動時創建的,不會被刪除。
    2,模塊的全局命名空間在模塊定義被讀入時創建,一般,解釋器退出,消失。
    3,被解釋器的頂層調用執行的語句,從一個腳本文件讀取或交互式地讀取,被認為是 main 模塊調用的一部分,因此它們擁有自己
    的全局命名空間。
    4,命名空間的生命周期取決于對象的作用域,如果對象執行完成,則該命名空間的生命周期就結束。因此,無法從外部命名空間訪問內 部命名空間的對象。

  • 函數的命名空間
    在調用時創建,函數返回值后,或者異常后刪除。但遞歸調用會有自己的命名空間。

在調用時創建,函數返回值后,或者異常后刪除。但遞歸調用會有自己的命名空間。

二,作用域

1, 作用域被靜態確定,但被動態使用。 在程序運行的任何時間,至少有三個命名空間可被直接訪問的嵌套作用域:

? 最先搜索的最內部作用域包含局部名稱。 比如一個函數/方法內部。 - local? 從最近的封閉作用域開始搜索的任何封閉函數的作用域包含非局部名稱,也包括非全局名稱。 - 嵌套函數 nonlocal、一個函數(或類) A 里面又包含了一個函數 B ,那么對于 B 中的名稱來說 A 中的作用域就為 nonlocal。? 倒數第二個作用域包含當前模塊的全局名稱 - global比如當前模塊的全局變量。? 最外面的作用域(最后搜索)是包含內置名稱的命名空間 - 一定存在 built-in


2,四種作用域的舉例

  • 全局名稱與局部名稱
# var1 是全局名稱 var1 = 0 def my_func():var2 = 1 # var2 是局部名稱def my_innerfunc():var3 = 2 # var3 是內嵌局部名稱
  • 訪問全局,局部名稱,是兩個分開的東西
global_var = 0 # 全局作用域def show():local_var = 'nonlocal scope' # 閉包函數外的函數中# print(inner_local_var) 無法訪問def local_func():inner_local_var = 'local scope' # 局部作用域local_func()show()
  • 內置作用域
# 內置作用域import builtinsprint(dir(builtins))
  • 控制語句的作用域可以理解是全局的
'''?,在python中只有函數,類,lambda,模塊才會引入新的作用域,其它的代碼塊不會引入(if elif else while / for try/except/else/finally)'''>>> try:... a = 1... print(1/0)... except:... print('you\'re wrong!')... raise... finally:... print('a', a)...you're wrong!a 1Traceback (most recent call last):File "<stdin>", line 3, in <module>ZeroDivisionError: division by zero>>> a1
  • nonlocal,非全局也非局部,只可在嵌套函數內訪問
def update_nonlocal(): # 全局名稱var = 1 # 局部名稱def inner():nonlocal var # 存在非局部,非全局變量之間var = 100print(var) # 100inner()print(var) # 100

3,global和nonlocal的區別

  • nonlocal的作用域只在嵌套函數中,而且在第一個嵌套函數中聲明了名稱,才可在第二個函數中聲明這個變量為nonlocal
def test_nonlocal():x = 99print(x, id(x))def show_x():nonlocal x print(x, id(x))x = 999print(x, id(x))show_x()test_nonlocal() ''' 99 140705925728384 99 140705925728384 999 2145717490672 '''
  • global 的名稱在函數中可以讀,但是不可寫,除非你把這個函數中的名稱也申明為global
num = 1 print('全局名稱num ', num) def update_num():global num # 聲明全局名稱num = 11update_num() print('global 關鍵字后,', num) ''' 全局名稱num 1 global 關鍵字后, 11 '''

最后,一張namespace和scope的圖送上

總結

以上是生活随笔為你收集整理的命名空间和作用域的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。