编译原理 python_Python局部变量编译原理
因此,Python將始終將每個函數(shù)中的每個名稱分類為本地名稱,非本地名稱或全局名稱.這些名稱范圍是獨(dú)占的;在每個函數(shù)內(nèi)(嵌套函數(shù)中的名稱都有自己的命名范圍),每個名稱只能屬于這些類別中的一個.
當(dāng)Python編譯這段代碼時(shí):
def fun():
if False:
x=3
它將產(chǎn)生一個抽象語法樹,如:
FunctionDef(
name='fun',
args=arguments(...), b
body=[
If(test=NameConstant(value=False),
body=[
Assign(targets=[Name(id='x', ctx=Store())], value=Num(n=3))
],
orelse=[])
]
)
(為簡潔起見省略了一些東西).現(xiàn)在,當(dāng)這個抽象語法樹被編譯成代碼時(shí),Python將掃描所有名稱節(jié)點(diǎn).如果存在任何名稱節(jié)點(diǎn),使用ctx = Store(),則該名稱被認(rèn)為是封閉的FunctionDef的本地名稱(如果有),除非在同一函數(shù)定義中覆蓋全局(即全局x)或非本地(非本地x)語句.
ctx = Store()將主要發(fā)生在賦值的左側(cè)使用有問題的名稱,或者作為for循環(huán)中的迭代變量時(shí).
現(xiàn)在,當(dāng)Python將其編譯為字節(jié)碼時(shí),生成的字節(jié)碼就是
>>> dis.dis(fun)
4 0 LOAD_GLOBAL 0 (print)
3 LOAD_FAST 0 (x)
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
優(yōu)化器完全刪除了if語句;但是由于變量已經(jīng)標(biāo)記為函數(shù)的本地變量,因此LOAD_FAST用于x,這將導(dǎo)致x從局部變量和局部變量訪問.由于尚未設(shè)置x,因此拋出UnboundLocalError.另一方面,名稱print從未被賦值,因此被認(rèn)為是此函數(shù)中的全局名稱,因此其值使用LOAD_GLOBAL加載.
總結(jié)
以上是生活随笔為你收集整理的编译原理 python_Python局部变量编译原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断ipad还是安卓_?谷歌认输,iPa
- 下一篇: vivado 验证ddr引脚_vivad