# 一:命名空間namespacs:存放名字的地方,是對棧區的劃分# 有了命名空間之後,就可以在棧區中存放相同的名字,詳細的,命名空間
# 分為三種
# 1.1 內建命名空間
# 存放的名字:存放的python直譯器內建的名字
>>> input
'''# 存活週期:python直譯器啟動則產生,python直譯器關閉則銷毀
# 1.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
# 1.3 區域性命名空間# 存放的名字:在呼叫函式時,執行函式體**過程中產生的函式內的名字
# 存活週期:在呼叫函式時存活,函式呼叫完畢後則銷毀
# def func(a,b):
# pass
# func(10,1) #調幾次產生幾個不同的命名空間,也就是在呼叫函式是每個呼叫的函式會產生不同的區域性命名空間來存放自己的a,b 所以說不同函式內a,b變數名可以相同
# func(11,12)
# func(13,14)
# func(15,16)
# 1.4 命名空間的載入順序# 內建命名空間》全域性命名空間》區域性命名空間
#內建命名空間和全域性命名空間肯定會有
# 1.5 銷毀順序
# 區域性命名空間》全域性名空間》內建命名空間
# 內建命名空間
# 全域性命名空間
# 區域性命名空間
#示例1
# 如果當前在區域性命名空間:# 區域性命名空間—>全域性命名空間->內建命名空間
input=333
def func():
input=444
print(input)
func() #呼叫func()首先在區域性空間查詢有無input變數名,有的話輸出值本次輸出應該為444
# 如果當前在全域性命名空間# 全域性命名空間->內建命名空間
input=333
def func():
input=444
func()
print(input) #print語句位於函式外,會先在全域性命名空間查詢有無input變數,找到輸出333
def func():input=555
func()
print(input)
#這時候會輸出
,因為這時全域性命名空間並沒有input這個變數名,會在內建命名空間去尋找
# 示例2:命名空間的"巢狀"關係是以函式定義階段為準,與呼叫位置無關
x=1def func():
print(x)
def foo():
x=222
func()
foo()
#這裡輸出的結果是1
#示例3:命名空間的巢狀關係是以函式定義階段為準,與呼叫位置無關
input=111def f1():
def f2():
#input=333
print(input)
input=222
f2()
f1() #這裡輸出的結果是222
# 示範4:命名空間的巢狀關係一定從定義階段開始,定義掃瞄的時候就記住了,變數一定要先定義後引用x=111
def func():
print(x)
x=222
func() #報錯:local variable 'x' referenced before assignment,在定義時認為區域性變數裡有x變數,預設在呼叫時在區域性命名空間中查詢,但是在呼叫過程中發現變數在
定義前使用
# 二:作用域-》作用範圍# 全域性作用域:內建命名空間、全域性命名空間
# 1、全域性存活
# 2、全域性有效:被所有函式共享
x=111def foo():
print(x,id(x))
def bar():
print(x,id(x))
foo()
bar()
print(x,id(x)) #所有的輸出x值相同,id值(物件的記憶體位址。)也相同
# 區域性作用域: 區域性命名空間的名字# 1、臨時存活
# 2、區域性有效:函式內有效
# legb
# legb代表名字查詢順序: locals -> enclosing function -> globals -> __builtins__# locals 是函式內的名字空間,包括區域性變數和形參
# enclosing 外部巢狀函式的名字空間(閉包中常見)
# globals 全域性變數,函式定義所在模組的名字空間
# builtins 內建模組的名字空間
# builtin# globaldef f1():# enclosing
def f2():
# enclosing
def f3():
# local
pass
#global與nonlocal
#global# 示範1:
x=111
def func():
x=222
func()
print(x) #這裡輸出的是111,全域性空間內變數值
# 示例2:
如果在區域性想要修改全域性的名字對應的值(不可變型別),需要用global
x=111def func():
global x # 宣告x這個名字是全域性的名字,不要再造新的名字了
x=222
func()
print(x) #呼叫func()函式修改了全域性變數x,輸出為222
# 示例3:l=[111,222]
def func():
func()
print(l) #輸出值為[111,222,333]
# nonlocal(了解): 修改函式外層函式包含的名字對應的值(不可變型別)
x=0def f1():
x=11
def f2():
nonlocal x
x=22
f2()
print('f1內的x:',x)
f1() #輸出的是22
def f1():x=def f2():
f2()
print('f1內的x:',x)
f1() #與global相似對於外層函式的不可變型別變數可以直接修改,輸出結果為:f1內的x: [1111]
Python命名空間和作用域
乙個命名空間中不能有重名,但不同的命名空間是可以重名而沒有任何影響。命名空間的生命週期取決於物件的作用域,如果物件執行完成,則該命名空間的生命週期就結束。因此,我們無法從外部命名空間訪問內部命名空間的物件。內建作用域是通過乙個名為 builtin 的標準模組來實現的,預定義了哪些變數 python ...
python命名空間和作用域
namespace 命名空間 命名空間 內建 命名空間 python直譯器啟動之後就可以使用的變數 函式名 全域性 命名空間 在函式外面的變數名 函式名 區域性 命名空間 每乙個函式都擁有自己的命名空間 python直譯器執行 載入順序 所有 內建空間函式名 變數 逐行 載入全域性空間變數 函式名 ...
Python命名空間和作用域
準備知識 1.在python直譯器開始執行之後,機會在記憶體中開闢乙個空間,每當遇到 乙個變數的時候,就把變數和值之間的關係記錄下來,但是當遇到函式定義 的時候,直譯器只是把函式名讀入記憶體,表示這個函式存在,至於函式內部 的變數和邏輯,直譯器是不關心的。也就是說一開始的時候函式只是載入進 來,僅此...