命名空間和作用域

2022-03-18 22:09:28 字數 2637 閱讀 4054

​ 命名空間是對棧區的劃分,存放名字的地方.有了命名空間之後,就可以在棧區中存放相同的名字

存放的名字:

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

存活週期:

​ python直譯器啟動則產生,python直譯器關閉則銷毀

>>> print

>>> input

存放的名字:

​ 只要不是函式內定義、也不是內建的,剩下的都是全域性命名空間的名字

存活週期:

​ python檔案執行則產生,python檔案執行完畢後銷毀

import os

x=10

if 13 > 3:

y=20

if 3 == 3:

z=30

# func=函式的記憶體位址

def func():

pass

class foo:

pass

存放的名字:

​ 在呼叫函式時,執行函式體**過程中產生的函式內的名字

存活週期:

​ 在呼叫函式時存活,函式呼叫完畢後則銷毀

def func(a,b):

pass

func(10,1)

func(11,12)

func(13,14)

func(15,16)#分別建立不同的區域性命名空間

內建命名空間》全域性命名空間》區域性命名空間

區域性命名空間》全域性名空間》內建命名空間

當前所在的位置向上一層一層查詢

如果當前在區域性命名空間:

區域性命名空間—>全域性命名空間->內建命名空間

input=333

def func():

# input=444

print(input)

func()

如果當前在全域性命名空間

全域性命名空間->內建命名空間

input=333

def func():

input=444

func()

print(input)

示範1:

def func():

print(x)

x=111

func()

示範2:命名空間的"巢狀"關係是以函式定義階段為準,與呼叫位置無關

x=1def func():

print(x)

def foo():

x=222

func()

foo()

示範3:函式巢狀定義

input=111

def f1():

def f2():

# input=333

print(input)

input=222

f2()

f1()

示範4:

x=111

def func():

print(x) #

x=222

func()

​ 內建命名空間、全域性命名空間

特點:

x=111

def foo():

print(x,id(x))

def bar():

print(x,id(x))

foo()

bar()

print(x,id(x))

​ 區域性命名空間的名字

特點:

def foo(x):

def f1():

def f2():

print(x)

# legb

# builtin

# global

def f1():

# enclosing

def f2():

# enclosing

def f3():

# local

pass

#示範1:

x=111

def func():

global x # 宣告x這個名字是全域性的名字,不要再造新的名字了

x=222

func()

print(x)

#示範2:對於不可變型別,不需要再次定義

l=[111,222]

def func():

func()

print(l)

x=0

def f1():

x=11

def f2():

nonlocal x

x=22

f2()

print('f1內的x:',x)

f1()

命名空間和作用域

1 命名空間查詢順序 假設我們要使用變數 runoob,則 python 的查詢順序為 直譯器會從命名空間中查詢runoob,它先從區域性空間查詢,如果找到了它就會使用區域性命名空間的變數runoob,即使全域性命名空間也有變數runoob。這就很容易理解為什麼在函式內部宣告的區域性變數會覆蓋掉在模...

命名空間和作用域

函式內部的函式只能在函式內部呼叫,不能在函式外部呼叫,通過接下來的學習你將會知道為什麼會出現這種情況。def f1 def f2 print from f2 f2 f2 nameerror name f2 is not defined 命名空間 name spaces 在記憶體管理那一章節時,我們曾...

命名空間和作用域

命名空間 就是存放名字和物件對映 繫結關係的地方 存放名字的空間 如果你想訪問乙個變數值,必須先訪問對應的命名空間拿到名字和對應的記憶體位址的繫結位址 python提前給你定義完的名字,就是存在內建命名空間,比如內建函式名 max print input 存放於檔案級別的名字,就是全域性命名空間 i...