- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Python 中,globals()
返回全局符号表的表示,而 locals()
返回本地状态的表示。虽然两者都返回字典,但对 globals()
的更改会在全局符号表中生效,而对 locals()
的更改则无效。
为什么会这样?
最佳答案
函数局部变量在编译时进行了高度优化和确定,CPython 建立在无法在运行时动态更改已知局部变量的基础上。
解码函数字节码时可以看到:
>>> import dis
>>> def foo():
... a = 'bar'
... return a + 'baz'
...
>>> dis.dis(foo)
2 0 LOAD_CONST 1 ('bar')
3 STORE_FAST 0 (a)
3 6 LOAD_FAST 0 (a)
9 LOAD_CONST 2 ('baz')
12 BINARY_ADD
13 RETURN_VALUE
LOAD_FAST
和 STORE_FAST
操作码使用 索引 来加载和存储变量,因为在框架上,局部变量是作为数组实现的。访问数组比使用哈希表(字典)更快,例如用于全局命名空间。
locals()
函数在函数中使用时,会返回此数组的反射 作为字典。更改 locals()
字典不会将其反射(reflect)回数组中。
在 Python 2 中,如果您在代码中使用 exec
语句,则优化(部分)被破坏; Python 使用较慢的 LOAD_NAME
opcode在这种情况下:
>>> def bar(code):
... exec code
... return a + 'baz'
...
>>> dis.dis(bar)
2 0 LOAD_FAST 0 (code)
3 LOAD_CONST 0 (None)
6 DUP_TOP
7 EXEC_STMT
3 8 LOAD_NAME 0 (a)
11 LOAD_CONST 1 ('baz')
14 BINARY_ADD
15 RETURN_VALUE
另见 bug report against Python 3其中 exec()
(Py3 中的函数)不再允许您设置本地名称:
To modify the locals of a function on the fly is not possible without several consequences: normally, function locals are not stored in a dictionary, but an array, whose indices are determined at compile time from the known locales. This collides at least with new locals added by exec. The old exec statement circumvented this, because the compiler knew that if an exec without globals/locals args occurred in a function, that namespace would be "unoptimized", i.e. not using the locals array. Since exec() is now a normal function, the compiler does not know what "exec" may be bound to, and therefore can not treat is specially.
关于python - globals() 与 locals() 可变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29083659/
我遇到了 python 问题..我有一个二叉树节点类型: class NODE: element = 0 leftchild = None rightc
这个问题已经有答案了: Local (?) variable referenced before assignment [duplicate] (3 个回答) 已关闭 4 年前。 我有一些来自初学者编
class TestClass(object): def __init__(self): self.value = 100 self.x = lambda: s
谁能解释为什么下面的代码会编译,但如果我注释掉一行,那么它不会,即使代码本质上在做同样的事情? struct OtherStruct { x: i32, } struct Inner { bl
我有一个在同一主机上运行的 TCP 客户端和服务器。客户端发送消息,服务器确认该消息,然后客户端发送下一条消息。在任何时刻,都只有一条未处理的未确认消息。消息大小为 1KB。家庭计算机运行CentOs
我是 Panda 的 Dataframe 的新手,如果有人可以通过以下示例向我简要讨论 DataFrame 的可变性,我将不胜感激: d1=pd.date_range('1/1/2016',perio
在 C++ 编程语言第 4 版的第 16.2.9.4 节“通过间接实现的可变性”中,有一个使用间接代替 mutable 关键字进行惰性求值的示例的草图。 struct cache { bool
我对 Haskell 了解不多,但从我读到的关于计算的可变性(例如:函数返回函数、复杂的 monad 和函数等)的内容来看,你似乎可以做很多元编程,即使在运行时。 如果像函数和 monad 这样的一切
在 Python 中,globals() 返回全局符号表的表示,而 locals() 返回本地状态的表示。虽然两者都返回字典,但对 globals() 的更改会在全局符号表中生效,而对 locals(
我正在关注斯坦福算法 MOOC 并尝试使用 Haskell 解决问题。许多算法需要大量的数据处理,纯解决方案的运行速度比人们为命令式语言引用的基准要慢得多。所以我觉得我需要使用可变数据结构。 大多数
在 react 井字游戏中 tutorial ,为什么他们必须使用 Array.slice()? handleClick(i) { const squares = this.state.square
在 react 井字游戏中 tutorial ,为什么他们必须使用 Array.slice()? handleClick(i) { const squares = this.state.square
在 C# 中,我想制作“智能”枚举,这在 Java 中是可能的,其中有更多信息附加到枚举值,而不仅仅是底层 int。我偶然发现了一个创建类(而不是枚举)的方案,如以下简单示例所示: public se
我是一名优秀的程序员,十分优秀!