在创建变量期间 Python 之前发生了什么?
what's happen earlier in Python during creating a variable?
解说员是起名还是起物?
例如:
VAR = 100
最初,解释器创建一个名称 VAR 并为 VAR 分配一个值为 100 的对象,或者解释器创建一个具有值 100 的对象并进一步创建一个名称 VAR 并为其分配一个对象 ?
它创建了一个新对象,但是根据this documentation,已经为-5
和256
之间的所有整数创建了可以使用的对象,所以在你的示例 Python 已经为 100
创建了一个整数对象,它将被引用而不是创建一个全新的对象。
回答你的下一个问题,if var=257
Python 仍然会创建一个对象。首先创建什么?好吧,有一个名为 dis
的模块可以让我们将任何 Python 代码反汇编为生成的字节码。如果我们这样做
dis.dis('var = 257')
然后我们得到
1 0 LOAD_CONST 0 (257)
2 STORE_NAME 0 (var)
4 LOAD_CONST 1 (None)
6 RETURN_VALUE
您可以看到每个字节码指令的作用here。
STORE_NAME 的字节码指令说(TOS 代表栈顶):
STORE_NAME(namei)
Implements name = TOS. namei is the index of name in
the attribute co_names of the code object.
如果在 cPython 的 PyLongObject (cPython's int object) is created. Often times the compile.c 文件之前将名称添加到 co_names
(代码对象名称),则不会共享更多信息,从而更好地了解字节码操作的工作原理在幕后,但我无法在源代码中找到您问题的确切答案。我想 PyLongObject
首先创建然后添加到 co_names
否则你必须添加名称并将其设置为 null 然后在创建 [= 后返回并更改它18=],这只是更混乱和更慢。
解说员是起名还是起物? 例如: VAR = 100 最初,解释器创建一个名称 VAR 并为 VAR 分配一个值为 100 的对象,或者解释器创建一个具有值 100 的对象并进一步创建一个名称 VAR 并为其分配一个对象 ?
它创建了一个新对象,但是根据this documentation,已经为-5
和256
之间的所有整数创建了可以使用的对象,所以在你的示例 Python 已经为 100
创建了一个整数对象,它将被引用而不是创建一个全新的对象。
回答你的下一个问题,if var=257
Python 仍然会创建一个对象。首先创建什么?好吧,有一个名为 dis
的模块可以让我们将任何 Python 代码反汇编为生成的字节码。如果我们这样做
dis.dis('var = 257')
然后我们得到
1 0 LOAD_CONST 0 (257)
2 STORE_NAME 0 (var)
4 LOAD_CONST 1 (None)
6 RETURN_VALUE
您可以看到每个字节码指令的作用here。
STORE_NAME 的字节码指令说(TOS 代表栈顶):
STORE_NAME(namei)
Implements name = TOS. namei is the index of name in the attribute co_names of the code object.
如果在 cPython 的 PyLongObject (cPython's int object) is created. Often times the compile.c 文件之前将名称添加到 co_names
(代码对象名称),则不会共享更多信息,从而更好地了解字节码操作的工作原理在幕后,但我无法在源代码中找到您问题的确切答案。我想 PyLongObject
首先创建然后添加到 co_names
否则你必须添加名称并将其设置为 null 然后在创建 [= 后返回并更改它18=],这只是更混乱和更慢。