python全棧闖關--10-一、命名空間和做用域

一、引子

a = 1
def func():
    print(a)
func()

函數func中,可使用函數外的變量a,這就涉及到命名空間和做用域。python

 

二、命名空間

命名空間分三種函數

一、內置命名空間 —— python解釋器spa

  內置命名空間在python一啓動的時候就可使用code

  內置的名字,啓動解釋器的時候,就加載進內存裏blog

二、全局命名空間 —— 本身寫得代碼但不是函數中的代碼內存

  從下到下執行代碼的時候加載進內存作用域

  存放了設置的變量名和函數名input

三、內置命名空間 —— 函數class

  函數內部定義的名字變量

  當函數調用時,才產生這個命名空間,隨之函數的執行結束,這個命名空間也就消失

 

在局部:可使用全局和內置命名空間的名字

在全局:可使用內置命名空間中的名字,可是不能用局部命名空間的

在內置:不能使用全局和局部命名空間中的名字

def max(l):
    print("in max func")
print(max([1,2,3,4]))

執行結果

 

正常狀況下,咱們能夠直接使用內置的名字

可是,若是在全局定義了和內置名字同樣的名字是,會使用全局的名字

多個函數,擁有多個獨立的局部命名空間,不共享

 

三、函數的調用和地址

def input():
    print("in input now!")

def func():
    print(input)  # 打印的結果爲函數的地址,並不會執行函數
func()

func → 不加括號,獲取的是函數的地址

 函數名()→ 調用函數

函數的內存地址()→ 調用函數

 

四、做用域

全局做用域 —— 做用全局 —— 內置和全局命名空間中的名字都屬於全局做用域 —— gloabs()

局部做用域 —— 做用局部 —— 函數(局部命名空間中的名字屬於局部做用域)  —— locals()

# 在全局做用域,globals和locals同樣
print(globals())
print(locals())

# 在局部做用域,globals顯示全局做用域的名字,locals只顯示局部做用域的名字
def func():
    a = 1
    b = 2
    print(globals())
    print(locals())
func()

globals()永遠打印全局名字

locals()根據local所在位置,打印

 

對於全局做用域的不可變數據類型的變量,在局部做用域不可變。

若是須要修改,須要使用global參數申明

a = 1
def func1():
    a += 1  # 更改全局的變量,報錯local variable 'a' referenced before assignment
func1()

a = 1
def func1():
    global a
    a += 1  # 更改全局的變量,因爲申明瞭global a程序能夠執行
func1()
print(a)  # 由於申明瞭global,變量改變

 

使用global參數,更改變量的值,存在危險性。

不看函數代碼時,沒法知道變量是否改變。

所以,在改變全局域變量時,採起傳值——返回值的方式進行

a = 1
def func(a):
    a = 2
    return a
a = func(a)
print(a)
相關文章
相關標籤/搜索