【问题标题】:what's happen earlier in Python during creating a variable? [closed]在创建变量期间,Python 早期发生了什么? [关闭]
【发布时间】:2022-01-03 04:40:37
【问题描述】:

解释器是否生成名称或对象? 例如: VAR = 100 最初,解释器创建一个名称 VAR 并为 VAR 分配一个值为 100 的对象,或者解释器创建一个值为 100 的对象并进一步创建一个名称 VAR 并为其分配一个对象?

【问题讨论】:

  • 我不确定您所说的“名称”或“对象”是什么意思。您能否澄清一下您的困惑来源是什么?
  • 你为什么要问?我想不出像这样的基本任务会有任何行为差异的情况。
  • var = 1 def f(): var = var + 1 if a var is created early 我可以理解基于legb规则的逻辑,否则我不能
  • @vipnoob 那是完全不同的情况,因为范围是一个因素。见UnboundLocalError on local variable when reassigned after first use

标签: python object variables


【解决方案1】:

它创建了一个新对象,但是根据this documentation,已经为-5256 之间的所有整数创建了可以使用的对象,因此在您的示例中,Python 已经创建了一个整数对象100 将被引用而不是创建一个全新的对象。

回答你的下一个问题,如果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(姓名)

实现名称 = TOS。 namei 是名称的索引 code object 的属性 co_names。

如果在创建 PyLongObject (cPython's int object) 之前将名称添加到 co_names(代码对象名称),则不会共享更多信息。通常,cPython 的 compile.c 文件可以很好地了解字节码操作如何在幕后工作,但我无法在源代码中找到您问题的确切答案。我想首先创建PyLongObject,然后添加到co_names,否则您必须添加名称并将其设置为null,然后在创建PyLongObject后返回并更改它,即只是更乱更慢。

【讨论】:

  • okey if var = 257, 先创建什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2022-08-19
相关资源
最近更新 更多