日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python变量的作用_python 变量的作用范围

發(fā)布時間:2023/12/4 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python变量的作用_python 变量的作用范围 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

python 的變量作用域分三種

1: local 指當前作用域

通過locals() 能獲取該命名空間的對象的dict

2:global 對應某個 .py 模塊的作用域

通過globals() 能獲取該命名空間的對象的dict

3:builtin 最頂層的作用域。

每次執(zhí)行一個函數(shù)時, 就會創(chuàng)建新的局部命名空間。

解釋器在檢索變量的時候會按照  local》global 》builtin 的順序檢索。

比如檢索變量 test(只要該變量沒有被聲明為local變量,=, -=, += 這樣的操作會將變量聲明為local變量)會先從 local 檢索, 沒有檢索到則 檢索 global, 再沒檢索到則檢索 builtin. 如果最后沒有檢索到 則拋出 NameError的異常。

def space():

a = 21

print "local:", locals()

print "globals:", globals()

執(zhí)行該函數(shù)的輸出為:

local: {'a': 21}

globals: {'__builtins__': , '__file__': 'space.py', '__package__': None, 'test': , '__name__': '__main__', '__doc__': None}

這個栗子很好理解, 那么如果

a = 31

def space():

a = 21

print "local:", locals()

print "globals:", globals()

space()

的輸出為:

local: {'a': 21}

globals: {'a': 31, '__builtins__': , '__file__': 'space.py', '__package__': None, 'test': , '__name__': '__main__', '__doc__': None}

紅色的能很方便我們理解 local 和global 作用域的區(qū)別。

在函數(shù)里面, 只要有 =, +=, -= 這樣的賦值語句, 那么被賦值的變量就是local的

舉個栗子:

deft(a):

a+= 1

print "a in function:", aprint "locals:", locals()

a= 21t(a)

輸出為:

a in function: 22

locals: {'a': 22}

a after invoking: 21

下面的代碼也能正常進行

deft():if a > 1: # 檢索a會先從local作用域檢索, 然后在檢索global作用域, 發(fā)現(xiàn)a = 21print "this a is global:", aprint "a in function:", aprint "locals:", locals()

a= 21t()

而下面的代碼會報錯:

deft():if a > 1:print "this a is global:", a

a= 3 # 此處因為有 +=, =, -= 這樣的, 所以a在該函數(shù)t內(nèi)是local的, 只會在local作用域檢索a。然后上一句if a > 1會報錯

print "a in function:", aprint "locals:", locals()

a= 21t()

報錯:

UnboundLocalError: local variable 'a' referenced before assignment

在函數(shù)里面,如果所傳的值是容引用,那么在函數(shù)里面對容器的修改也會修改 global作用域內(nèi)的該容器。

deft(a):

a['hello'] = "happy"

print "a in function:", aprint "locals:", locals()

a={}

t(a)print "a after invoking:", a

的輸出為:

a in function: {'hello': 'happy'}

locals: {'a': {'hello': 'happy'}}

a after invoking: {'hello': 'happy'}

函數(shù)的參數(shù)默認值, test_default(下面栗子的)默認值為引用類型會在使用之后一直保存,每次對默認值的修改都會保留下來, 類似與C的靜態(tài)局部變量。但是如果自己傳了一個值來替換引用的默認值, 則不會修改保留下來的默認值。

def test_default(k, v, d ={}):

d[k]=vprint "d reference:", d

test_default("k3", "v3", d ={})  #此處傳了一個值來替換引用的默認值, 那么修改的不是默認引用的值

test_default("k1", "v1")

test_default("k2", "v2")

的輸出為:

d reference: {'k3': 'v3'}

d reference: {'k1': 'v1'}

d reference: {'k2': 'v2', 'k1': 'v1'}

lambda 里面的默認值

funcs = [lambda x, i=i: x*i for i in range(4)]print [func(2) for func in funcs]

的輸出為:

[0, 2, 4, 6]

而:

funcs = [lambda x: x*i for i in range(4)]print [func(2) for func in funcs]

的輸出為:

[6, 6, 6, 6]

函數(shù)在沒有執(zhí)行前, 內(nèi)部代碼不執(zhí)行

總結(jié)

以上是生活随笔為你收集整理的python变量的作用_python 变量的作用范围的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。