中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python名稱空間與作用域實例分析

發布時間:2022-04-14 09:10:02 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

本篇內容主要講解“Python名稱空間與作用域實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python名稱空間與作用域實例分析”吧!

一 名稱空間

名稱空間即存放名字與對象映射/綁定關系的地方。對于x=3,Python會申請內存空間存放對象3,然后將名字x與3的綁定關系存放于名稱空間中,del x表示清除該綁定關系。

在程序執行期間最多會存在三種名稱空間

1.1 內建名稱空間

伴隨python解釋器的啟動/關閉而產生/回收,因而是第一個被加載的名稱空間,用來存放一些內置的名字,比如內建函數名

>>> max
<built-in function max> #built-in內建

1.2 全局名稱空間

伴隨python文件的開始執行/執行完畢而產生/回收,是第二個被加載的名稱空間,文件執行過程中產生的名字都會存放于該名稱空間中,如下名字

import sys #模塊名sys

x=1 #變量名x

if x == 1:
    y=2 #變量名y

def foo(x): #函數名foo
    y=1
    def bar():
        pass

Class Bar: #類名Bar
	pass	

1.3 局部名稱空間

伴隨函數的調用/結束而臨時產生/回收,函數的形參、函數內定義的名字都會被存放于該名稱空間中

def foo(x):
    y=3 #調用函數時,才會執行函數代碼,名字x和y都存放于該函數的局部名稱空間中

名稱空間的加載順序是:內置名稱空間->全局名稱空間->局部名稱空間,而查找一個名字,必須從三個名稱空間之一找到,查找順序為:局部名稱空間->全局名稱空間->內置名稱空間。

二 作用域

2.1 全局作用域與局部作用域

按照名字作用范圍的不同可以將三個名稱空間劃分為兩個區域:

  • 全局作用域:位于全局名稱空間、內建名稱空間中的名字屬于全局范圍,該范圍內的名字全局存活(除非被刪除,否則在整個文件執行過程中存活)、全局有效(在任意位置都可以使用);

  • 局部作用域:位于局部名稱空間中的名字屬于局部范圍。該范圍內的名字臨時存活(即在函數調用時臨時生成,函數調用結束后就釋放)、局部有效(只能在函數內使用)。

2.2 作用域與名字查找的優先級

在局部作用域查找名字時,起始位置是局部作用域,所以先查找局部名稱空間,沒有找到,再去全局作用域查找:先查找全局名稱空間,沒有找到,再查找內置名稱空間,最后都沒有找到就會拋出異常

x=100 #全局作用域的名字x
def foo():
    x=300 #局部作用域的名字x
    print(x) #在局部找x
foo()#結果為300

在全局作用域查找名字時,起始位置便是全局作用域,所以先查找全局名稱空間,沒有找到,再查找內置名稱空間,最后都沒有找到就會拋出異常

x=100
def foo():
    x=300 #在函數調用時產生局部作用域的名字x
foo()
print(x) #在全局找x,結果為100

提示:可以調用內建函數locals()和globals()來分別查看局部作用域和全局作用域的名字,查看的結果都是字典格式。在全局作用域查看到的locals()的結果等于globals()

Python支持函數的嵌套定義,在內嵌的函數內查找名字時,會優先查找自己局部作用域的名字,然后由內而外一層層查找外部嵌套函數定義的作用域,沒有找到,則查找全局作用域

x=1
def outer():
    x=2
    def inner(): # 函數名inner屬于outer這一層作用域的名字
        x=3
        print('inner x:%s' %x)

    inner()
    print('outer x:%s' %x)

outer() 
#結果為
inner x:3
outer x:2

在函數內,無論嵌套多少層,都可以查看到全局作用域的名字,若要在函數內修改全局名稱空間中名字的值,當值為不可變類型時,則需要用到global關鍵字

x=1
def foo():
    global x #聲明x為全局名稱空間的名字
    x=2
foo()
print(x) #結果為2

當實參的值為可變類型時,函數體內對該值的修改將直接反應到原值,

num_list=[1,2,3]
def foo(nums):
    nums.append(5)

foo(num_list)
print(num_list)
#結果為
[1, 2, 3, 5]

對于嵌套多層的函數,使用nonlocal關鍵字可以將名字聲明為來自外部嵌套函數定義的作用域(非全局)

def  f1():
    x=2
    def f2():
        nonlocal x
        x=3
    f2() #調用f2(),修改f1作用域中名字x的值
    print(x) #在f1作用域查看x

f1()

#結果
3

nonlocal x會從當前函數的外層函數開始一層層去查找名字x,若是一直到最外層函數都找不到,則會拋出異常。

到此,相信大家對“Python名稱空間與作用域實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湖南省| 寿宁县| 凭祥市| 抚顺县| 抚州市| 襄汾县| 哈尔滨市| 饶阳县| 朝阳县| 滦南县| 临高县| 松潘县| 松溪县| 靖远县| 上饶市| 措勤县| 邳州市| 万年县| 瓮安县| 江孜县| 墨玉县| 久治县| 贡嘎县| 张掖市| 武威市| 肇庆市| 化州市| 休宁县| 同江市| 靖州| 神木县| 监利县| 松溪县| 巍山| 吴旗县| 福鼎市| 积石山| 咸阳市| 揭西县| 阳泉市| 宁津县|