栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python局部变量编译原理

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python局部变量编译原理

因此,Python始终会将每个函数中的每个名称归类为 localnon-localglobal之一
。这些名称范围是排他的;在每个函数中(嵌套函数中的名称都有其自己的命名范围),每个名称只能属于这些类别之一。

当Python编译此代码时:

def fun():    if False:        x=3

它将产生一个抽象的语法树,如下所示:

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=[])    ])

(为简洁起见,省略了一些内容)。现在,当将此抽象语法树编译为代码时,Python将扫描所有名称节点。如果存在

Name
带有的节点,则
ctx=Store()
该名称被认为是封闭的
本地 名称
FunctionDef
,除非在同一函数定义中用
global
(即
global x
)或
nonlocal
nonlocalx
)语句覆盖该名称。

ctx=Store()
主要在将名称用于赋值的左侧或在循环中用作迭代变量时,才会发生这种情况
for

现在,当Python将其编译为字节码时,生成的字节码为

>>> dis.dis(fun)  40 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

优化器

if
完全删除了该语句。但是,由于变量已被标记为函数的 局部 变量,因此
LOAD_FAST
用于
x
,这将导致只能
x
局部
变量和局部变量进行访问。由于
x
尚未设置,因此
UnboundLocalError
将引发。
print
另一方面,该名称从未分配给它,因此在该函数中被视为全局名称,因此其值将被加载
LOAD_GLOBAL



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/625775.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号