exec和locals()的问题

你好,
直到我对" a = 0"语句介绍,以下代码才能工作.
def test():
当地人中的执行" a = 3"()
打印
a = 0
测试()
打印加薪:
UnbounlocalError:引用的本地变量'a'
任务
有人可以解释这里出了什么问题吗?
问候,uwe

# 回答1


Rocksportrocker写道:
afaik,本地变量的实现方式与__slots __中的新风格相同
课程.这是一个非常有价值的效率措施,但可能会导致
有点麻烦.如果没有`a = 0`,bytecode编译器都不适用于a,
和dis.dis显示以下字符进行测试:
2 0 load_const 1('a = 3')
3 load_name 0(当地人)
6 call_function 0
9 DUP_TOP
10 exec_stmt
3 11 load_name 1(a)
14 print_item
15 print_newline
16 load_const 0(无)
19 return_value
在地址11,LOAD_NAME 1(a)获取由EXEC设置的值.
在a = 0的情况下,代码为
2 0 load_const 1('a = 4')
3 load_name 0(当地人)
6 call_function 0
9 DUP_TOP
10 exec_stmt
3 11 load_fast 0(a)
14 print_item
15 print_newline
4 16 LOAD_CONST 2(0)
19 Store_fast 0(a)
22 load_const 0(无)
25 return_value
在这里,通过load_fast在插槽0中找到A的值.插槽0使用
因为a = 0强迫a是局部变量.
显然,当地人()中的exec对插槽一无所知(因为locals()是
宇宙中唯一涉及插槽的词典? - -
也许不是,但关闭).
梅尔.
# 回答2


在7月1日,15:15,梅尔 afaik,本地变量的实现方式与__slots __中的新风格相同
课程. *这是一个非常有价值的效率措施,但可能会导致
有点麻烦. *如果没有`a = 0`,字节码编译器不适合a,
和dis.dis显示以下字节码进行测试:>> dis.dis(test)
* 2 * * * * * 0 load_const * * * * * * * 1('a = 3')
* * * * * * * 3 load_name * * * * * * * * * 0(当地人)
* * * * * * 6 call_function * * * * * * * 0
* * * * * * 9 dup_top
* * * * * * * 10 exec_stmt
* 3 * * * * * 11 load_name * * * * * * * * * 1(a)
* * * * * * * 14 print_item
* * * * * * * 15 print_newline
* * * * * * * 16 load_const * * * * * * * 0(无)
* * * * * * * 19 return_value
在地址11,LOAD_NAME 1(a)获取由EXEC设置的值.
使用a = 0,代码为>> dis.dis(test2)
* 2 * * * * * 0 load_const * * * * * * * 1('a = 4')
* * * * * * * 3 load_name * * * * * * * * * 0(当地人)
* * * * * * 6 call_function * * * * * * * 0
* * * * * * 9 dup_top
* * * * * * * 10 exec_stmt
* 3 * * * * * 11 load_fast * * * * * * * * 0(a)
* * * * * * * 14 print_item
* * * * * * * 15 print_newline
* 4 * * * * * 16 load_const * * * * * * * 2(0)
* * * * * * * 19 store_fast * * * * * * * * 0(a)
* * * * * * * 22 load_const * * * * * * * 0(无)
* * * * * * * 25 return_value
在这里,a的值通过负载在插槽0中找到 _快速地. *插槽0使用
因为a = 0强迫a是局部变量.
显然,当地人()中的exec对插槽一无所知(因为locals()是
宇宙中唯一涉及插槽的词典? - -
也许不是,但关闭).
* * * *梅尔.
感谢您的回答.我想知道这是一个错误,还是我想念
某物
在文档中???
问候,uwe
# 回答3


乌韦·施密特(Uwe Schmitt)写道:
感谢您的回答.我想知道这是一个错误,还是我想念
文档中的某些东西???
HM,该文档有明确的警告:http://docs.python.org/lib/built-in-funcs.html#l2h-47
"""
当地人()
更新并返回代表当前本地符号表的字典.
警告:该字典的内容不应修改;变化
可能不会影响解释器使用的局部变量的值.
"""
顺便说一下,如果您不提供本地名称空间
明确:
....执行" A = 42"
....打印
.... a ="任何东西"
...
42
彼得
# 回答4


En Fri,2008年7月11日03:51:39 -0300,Uwe Schmitt

感谢您的回答.我想知道这是一个错误,还是我想念
某物
在文档中???
阅读本地文档中的警告()内置函数:http://docs.python.org/lib/built/built-in-funcs.html#l2h-47
和执行函数:http://docs.python.org/lib/built-in-funcs.html#l2h-26
- -
Gabriel Genellina

标签: python

添加新评论