- 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/
我已经在我的电脑上安装了 node.js,当我运行这个命令时它给了我这个错误,我该怎么办??? npm WARN config global `--global`, `--local` are dep
在 PHP 中,我想知道 GLOBAL 和 GLOBALS 之间的区别。 一些例子: print_r($GLOBALS); 最佳答案 这是与同一事物相关的两个不同事物:全局变量。 $GLOBALS -
在某些 SCSS 文件中,我看到以下内容: :global { /* ... */ } 不知道是SCSS特性还是CSS特性。我尝试搜索它,但第一眼找不到任何好的结果。 最佳答案 此运算符用于 CS
我正在考虑向 JSON 添加注释并找到 this script在处理使 JSON 有效之前将它们去除。我只是想了解如何使 JSON.minify() 函数可用? 开始于 (function(globa
在我的 React 应用程序中,我尝试使用 react-widgets package 中包含的 DateTimePicker 组件.我还通过 reactstrap 使用 Bootstrap 4 组件
全局变量的作用域是所有文件,而静态全局变量的作用域只是它所在的文件被宣布。为什么这样? 全局或静态全局变量存储在内存中的什么位置? 最佳答案 有一些混淆,因为 C 中的 static 可能意味着两种不
我尝试从 Marko 组件访问全局变量,但收到 Uncaught ReferenceError: out is not Defined。 class { onClick(event) {
这个 fiddle 在 IE 和 FF 中返回正确的值“5,5”,但在 Chrome 中它返回“5.5” fiddle :http://jsfiddle.net/4tvSH/ Globalize.cu
我对 python 很陌生,我尝试制作一个简单的 GUI 程序。但是,我遇到了一个“问题”,确切地说是一个警告,上面写着:“m”未在全局范围内定义(Python(变量未定义全局))。 我知道如果你想在
将变量初始化为 global var 或调用 globals().update(var) 有什么区别。 谢谢 最佳答案 当你说 global var 您是在告诉 Python var 与在全局上下文中
我正在开发 ASP.NET Web 应用程序,对于未处理的异常,我正在使用Global.asax 文件 我在其中编写了将错误日志写为 的逻辑 Sub Application_Error(ByVal s
这是我的第一篇 StackOverflow 帖子。提前致谢!我在这里找到了很多答案,但在网络上的任何地方都找不到有关我当前问题的任何信息。 =( 我有一个 C# 服务,我已经使用 Visual Stu
问题: 我正在尝试将对我的 MongoDB 数据库的查询结果有效地分配给全局数组。我基本上尝试将对全局数组的引用存储在一个数组中,以便我可以将 for 循环中的查询结果分配给所有这些引用。 这似乎是不
我想看看 Node.js 中 global.process 的构造函数是否存储在任何地方。 例如,在网络中,构造函数很容易获得。例如,window 的构造函数是window.Window。所有构造函数
Tell me about the difference between global.asax and global.asax.cs ? 和 If i click the both file in
全局对象作为顶级词法环境(如果你愿意的话,在作用域链的顶部)。这意味着可以通过直接引用(如变量)访问全局属性: // global code this.foo = 1; // creat
如何修复 Depricated 警告消息 (node:6136) DeprecationWarning: 'GLOBAL' is deprecated, use 'global' 在我的代码中,我使用
在我的本地发布文件夹中,我有 Global.asax 和 Global.asax.cs,其中 Global.asax 未更新(日期为一个月前)和 Global.asax .cs 已更新。 我检查了 G
我有下面的代码,自动生成: $ react-native init RepeatAloud 应用程序.tsx /** * Sample React Native App * https://git
在 Node-red 仪表板上,我想以不同的流量显示相机流。背后的想法是在每个流上显示相机。 为了显示相机流,我使用了 iFrame。一切正常,但我必须为每个单独的 iFrame 提供流的 URL。
我是一名优秀的程序员,十分优秀!