我认为可以用字典来完成,其中键是变量名(str?),值是它所关联的引用。
这也是它内部的工作方式。在CPython中,变量名和它们指向的对象通常存储在Python字典中。与编写Python代码时可以使用的数据结构完全相同。
当您编写时
x =5,该名称将
x被设置为全局名称词典中的键,其中5为对应值。您可以使用
globals()函数返回并检查此字典,该函数提供当前作用域的名称空间的内容。
因此,您也很正确地认为该名称
x占用了空间。它以字符串形式存在于内存中,Python为字典的键保留了对它的引用。
如果您想更深入地了解CPython源代码,以了解
x将值5分配到的位置,则可以查看ceval.c。写操作
x =5会触发
LOAD_CONST操作码(将整数5放入堆栈),还会触发操作
STORE_GLOBAL码*(将名称设置
x为字典中的键,值为5)。
这是
STORE_GLOBAL操作码的代码:
TARGET(STORE_GLOBAL) { PyObject *name = GETITEM(names, oparg); PyObject *v = POP(); int err; err = PyDict_SetItem(f->f_globals, name, v); Py_DECREF(v); if (err != 0) goto error; DISPATCH();}您可以看到调用
PyDict_SetItem以更新全局字典。
*如果检查
x = 5(例如使用
dis)生成的字节码,则可能会看到所
STORE_NAME使用的操作码。此操作码以相同的方式起作用(请参见此处的简要说明)。



