1. 程式人生 > >Python 基礎 7 函式 作用域 全域性變數 區域性變數

Python 基礎 7 函式 作用域 全域性變數 區域性變數

作用域
作用域指的是變數在程式中的可應用範圍。
作用域按照變數的定義位置可以劃分為4類即LEGB:
Local(函式內部)區域性作用域。
Enclosing(巢狀函式的外層函式內部)巢狀作用域(閉包)。
Global(模組全域性)全域性作用域。
Built-in(內建)內建作用域。

Python搜尋4個作用域[本地作用域(L)之後是上一層結構中def或者lambda的本地作用域(E),之後是全域性作用域(G)最後是內建作用域(B)(即python的內建類和函式等)]
並且在第一處能夠找到這個變數名的地方停下來。如果變數名在整個的搜尋過程中都沒有找到,Python就會報錯。

注意:
在python中,模組(module),類(class)、函式(def、lambda)會產生新的作用域,其他程式碼塊是不會產生作用域的,也就是說,類似條件判斷(if……else)、迴圈語句(for x in data)、異常捕捉(try…catch)等的變數是可以全域性使用的。

b = 20  #b變數聲明瞭全域性的的作用域,因此可以再全域性使用
def func():
	a =10    # a變數在區域性作用域中,a變數的作用域範圍就是整個函式體
	print(a)
	print(b)
print(a)  #報錯   因為a變數已經出了自己作用域的範圍
func()
print(b)   #能正常執行
c = 30
def outter():
	a = 10
	def inner():
		b = 20
		print(b)
		print(a)   #訪問巢狀作用域中的內容
		print(c)   #訪問全域性作用域中的內容
	inner
	#print(b)  #出了自己的範圍
	print(a)
print(c)
#print(a)   #報錯
outter()

3,變數的搜尋範圍

a = 1
def outter():
	a = 10
	def inner():
		a = 20
		#print(a)  #20-->10-->1
	inner()
	#print(a) #  10 -->1
outter
print(a) #1

全域性變數和區域性變數
在函式中定義的變數稱為區域性變數,只在函式內部生效
在程式一開始定義的變數稱為全域性變數,全域性變數的作用域是整個程式

name = 'zs'  # 全域性變數

def func():
    name = 'ls'  # 區域性變數
    print(name)

func()

全域性變數是不可變資料型別,函式無法修改全域性變數的值
全域性變數是可變資料型別,函式可以修改全域性變數的值

a = 10
lst =[12,3]
def func(c,lst):
	c = 20
	lst1.append(4)
	print(c,lst1)
func(a,lst)
print(a,lst)
結果:
20 [12, 3, 4]
10 [12, 3, 4]
a = 10
lst = [1, 2, 3]
def func():
    a = 30
    print(a)
    lst.append(4)
func()
print(a)
print(lst)
結果:
30
10
[1, 2, 3, 4]