1. 程式人生 > 其它 >Python基礎之名稱空間、作用域

Python基礎之名稱空間、作用域

一、名稱空間

  名稱空間namespacs:存放名字的地方,是對棧區的劃分。有了名稱空間之後,就可以在棧區中存放相同的名字,詳細的,名稱空間

  例如:username='jason'(函式命名的空間,username指向jason指向的記憶體空間地址,而username在外部也有自己的空間)

  型別:三種

 

  1.內建的名稱空間

    存放的名字:存放的python直譯器內建的名字

'''
>>> print
<built-in function print>
>>> input
<built-in function input>
''' # 存活週期:python直譯器啟動則產生,python直譯器關閉則銷燬

  2、全域性名稱空間

    存放的名字:只要不是函式內定義、也不是內建的,剩下的都是全域性名稱空間的名字     存活週期:python檔案執行則產生,python檔案執行完畢後銷燬
# import os
#
# x=10
# if 13 > 3:
#     y=20
#     if 3 == 3:
#         z=30
#
# # func=函式的記憶體地址
# def func():
#     a=111
#     b=222
 
# class Foo:
#     pass

  3、區域性名稱空間

    存放的名字:在呼叫函式時,執行函式體程式碼過程中產生的函式內的名字

    存活週期:在呼叫函式時存活,函式呼叫完畢後則銷燬
# def func(a,b):
#     pass
#
# func(10,1)
# func(11,12)

  4、載入順序:內建名稱空間>全域性名稱空間>區域性名稱空間。名字的查詢優先順序:當前所在的位置向上一層一層查詢。名稱空間的"巢狀"關係是以函式定義階段為準,與呼叫位置無關

# 如果當前在區域性名稱空間:
# 區域性名稱空間—>全域性名稱空間->內建名稱空間
# # input=333   全域性
#
# def func():
# # input=444 #此時為區域性空間 # print(input) #此時下面呼叫函式,這個是在函式內部,所以先區域性 # # func() # 如果當前在全域性名稱空間 # 全域性名稱空間->內建名稱空間 # input=333 全域性 # def func(): # input=444 # func() # print(input) 未在函式內部,需要全域性

 

二、作用域

  1.全域性作用域:內建名稱空間、全域性名稱空間

    1、全域性存活

    2、全域性有效:被所有函式共享

# x=111         #作用全域性
#
# def foo():
#     print(x,id(x))
#
# def bar():
#     print(x,id(x))
#
# foo()
# bar()

  2.區域性作用域: 區域性名稱空間的名字

    1、臨時存活

    2、區域性有效:函式內有效
def text():
    #區域性變數
    a= "aaa"
    b= "bbb"
    return a ,b 
print(text())

 

關係等級圖

# LEGB
# builtin
# global全域性
# def f1():
#     # enclosing
#     def f2():
#         # enclosing
#         def f3():
#             local區域性
#             pass

 

區域性與全域性變數之修改

  1.如果再區域性想要修改全域性的名字對應的值(不可變型別),需要用global

x=111

def func():
    global x        # 宣告x這個名字是全域性的名字,不要再造新的名字了
    x=222

func()
print(x)     #此時全域性變數x就被改為222

  2.nonlocal(瞭解): 修改函式外層函式包含的名字對應的值(不可變型別)

x=0
def f1():
    x=11
    def f2():
        #nonlocal x
        x=22
    f2()
    print('f1內的x:',x)       #此時nonlocal x作用,導致f1內的x被修改為22

f1()