046 名稱空間和做用域

名稱空間和做用域

1、名稱空間

  • 咱們在學變量內存管理的時候就學過建立其實就是在內存中開闢了一個新的空間,可是咱們卻沒與具體的說變量的存儲。
  • 其實在內存中有一塊內存存儲變量名與變量間的綁定關係的空間,這個空間稱爲名稱空間

1.內置名稱空間

  • Python解釋器啓動的時候,python自動開闢內置名稱空間存放了這些python的內置方法,如關鍵字int、float、len
  • 在解釋器啓動時生效,在解釋器關閉時失效
len([1, 2, 3])
int('10')

2.全局名稱空間

  • 除了內置和局部的名字以外,其他都存放在全局名稱空間,如x、func、l、z
  • 全局名稱空間須要本身定義,在文件執行時生效,在文件執行結束後失效
x = 1
def func():
    pass

l = [1, 2]

if 3 > 2:
    if 4 > 3:
        z = 3

3局部名稱空間

  • 用於存放函數調用期間函數體產生的名字,以下面代碼的f2
  • 在文件執行時函數調用期間時生效,在函數執行結束後失效
def f1():
    def f2():
        print('from f2')
    f2()

f1()

2.加載順序

  • 因爲.py文件是由Python解釋器打開的,所以必定是在Python解釋器中的內置名稱空間加載結束後,文件纔開始打開,這個時候纔會產生全局名稱空間,但文件內有某一個函數被調用的時候,纔會開始產生局部名稱空間python

  • 三種名稱空間的執行順序:內置 --> 全局 --> 局部app

3.查找順序

  • 因爲名稱空間是用來存放變量名與值之間的綁定關係的,因此要查找名字,必定是從三者之一找到
  • 查找順序爲:局部-->全局-->內置:
  • 它是從當前的所在位置開始查找,若是當前所在的位置爲局部名稱空間,則查找順序爲:局部-->全局-->內置。
  • 若是當前所在的位置爲全局名稱空間,則查找順序爲:全局-->內置。
  • 若是當前所在的位置爲內置名稱空間,則只會在內置名稱空間找,若是找不到則會報錯

2、做用域

  • 產生做用的範圍

1.全局做用域

  • 全局有效,全局存活,包含內置名稱空間和全局名稱空間。
x = 1

def f1():
    return x

# 1

2.局部做用域

  • 局部名稱空間中的變量,局部做用域中的變量只能在局部中使用
x = 1

def f1():
    return x

def f2():
    x = 2  # x=2只能在f2中使用
    f1()
        
# 1

3.注意

  • 做用域關係在函數定義階段就已經肯定死了,與函數的調用無關。

3、補充

1.global關鍵字(不推薦使用)

  • 把局部的變量修改爲全局的變量
x = 1

def f1():
    global x  # 聲明x爲全局的x
    x = 3

f1()
print(x)# 3

3.nonlocal關鍵字(不推薦使用)

  • 針對嵌套函數局部之間的修改
  • 讓上一層函數體內的局部變量在下一層函數體內也有效
def f1():
    x = 1
    def f2():
        nonlocal x  # 針對嵌套函數局部之間的修改
        x = 3
    f2()
    print(x)# 3

f1()

3.用可變數據類型來修改局部做用域

  • 做用域關係僅適用不可變數據類型,不適用於可變數據類型
lt = [1,2,3]  # 做用域關係僅適用不可變數據類型,不適用於可變數據類型

 def f1():
     lt.append(4)

f1()

 print(lt)# [1,2,3,4]
# 字典的方式,字典是可變數據類型
dic = dict()

def login():
    dic['name'] = 'nick'
login()

def shopping():
    if dic.get('name'):
        print('購物成功')
    else:
        print('請登陸')
shopping()
相關文章
相關標籤/搜索