Python3的多个赋值和内存地址

Python3的多个赋值和内存地址,第1张

Python3的多个赋值和内存地址

这是由于字节码编译器中的不断折叠优化。当字节码编译器编译一批语句时,它使用字典来跟踪所看到的常量。该字典自动合并所有等效常量。

这是负责记录和编号常量(以及一些相关职责)的例程:

static intcompiler_add_o(struct compiler *c, PyObject *dict, PyObject *o){    PyObject *t, *v;    Py_ssize_t arg;    t = _PyCode_ConstantKey(o);    if (t == NULL)        return -1;    v = PyDict_GetItem(dict, t);    if (!v) {        arg = PyDict_Size(dict);        v = PyInt_FromLong(arg);        if (!v) { Py_DECREF(t); return -1;        }        if (PyDict_SetItem(dict, t, v) < 0) { Py_DECREF(t); Py_DECREF(v); return -1;        }        Py_DECREF(v);    }    else        arg = PyInt_AsLong(v);    Py_DECREF(t);    return arg;}

您会看到,如果找不到已经存在的等效常量,它只会添加一个新条目并分配一个新数字。(该

_PyCode_ConstantKey
位确保喜欢的东西
0.0
-0.0
以及
0
被认为是不等价的。)

在交互模式下,每次解释器必须实际运行您的命令时,批处理都会结束,因此在命令之间通常不会发生常量折叠:

>>> a = 1000>>> b = 1000>>> a is bFalse>>> a = 1000; b = 1000 # 1 batch>>> a is bTrue

脚本中,所有顶级语句都是一批,因此发生了更多的恒定折叠:

a = 257b = 257print a is b

在脚本中,将打印

True

函数的代码与函数外部的代码分开跟踪其常量,这限制了常量折叠:

a = 257def f():    b = 257    print a is bf()

即使在脚本中,也会打印出来

False



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5654025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存