就名称对象绑定而言,当我在 python 中创建诸如 c=[1] 的列表时会发生什么?

What happens when I create a list such as c=[1] in python, in terms of name object bindings?

看完http://www.effbot.org/zone/python-objects.htm我还有这个问题:

在 python 中,如果 a=1 创建一个整数对象并将其绑定到名称 ab=[] 创建一个空列表对象并将其绑定到name b,当我打电话时会发生什么c=[1]?

我想这会创建一个列表对象并将其绑定到名称 c,但是如何准确处理 1?在引擎盖下,列表对象的实际内容是什么样的?它是由整数对象还是对 "separate" 整数对象的引用组成的?可以考虑例如c[0] 作为绑定到列表项的名称?

还有以下内容:

d=1  # creates int(1)-object and binds it to d
e=[d]  # creates list-object and binds it to e, but what happens with d?

列表对象(名为 e)的内容是对名为 d 的整数对象还是新的整数对象的引用?

我想答案就在上面提到的 Lundh 先生的这句话中,但我仍然有点困惑:

You’re then calling a method on that object, telling it to append an integer object to itself. This modifies the content of the list object, but it doesn’t touch the namespace, and it doesn’t touch the integer object.

此外,我相信部分答案可以在这里找到:,但我仍在寻找更多见解。

In python, if a=1 creates an integer-object and binds it to the name a, b=[] creates an empty list-object and binds it to name b, what happens when I call e.g. c=[1]?

当您将 c 分配给 [1] 时,您告诉 Python 创建一个列表对象,其中包含指向整数对象的 指针 1 的值。这可以通过查看列表对象在幕后如何在 C 中表示来看出:

typedef struct {
    PyObject_VAR_HEAD
    PyObject **ob_item;
    Py_ssize_t allocated;
} PyListObject;

从上面的例子可以看出,ob_item是一个指针序列,每个指针指向内存中的一个PyObject。在您的例子中,ob_item 包含一个指向整数对象 1.

的指针

Is it okay to think of e.g. c[0] as a name bound to a list item?

不是真的。当你做 c[0] 你告诉 Python 到 return 一个指向索引 0 处的对象的指针。通过查看我们在 C 级别索引列表对象时发生的情况,可以再次观察到这一点:

Py_INCREF(a->ob_item[i]);
return a->ob_item[i];

And what about the following:

d=1  # creates int(1)-object and binds it to d
e=[d]  # creates list-object and binds it to e, but what happens with d?

在上面的示例中,变量 d 是对象 1 的别名,而 e 包含指向对象 1 的指针。但是 de[0] 都指向同一个对象:

>>> a = 10
>>> b = [a]
>>> id(a) == id(b[0])
True
>>> 

当您 e = [d] 告诉 Python 构建一个列表,其中包含指向 d 正在引用的对象的指针。