7

阅读http://www.effbot.org/zone/python-objects.htm后,我留下了这个问题:

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

我想这会创建一个 list-object 并将其绑定到 name c,但究竟是如何1处理的呢?列表对象的实际内容在幕后是什么样子的?它是由整数对象还是对“单独”整数对象的引用组成?可以将例如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 先生的这句话中,但我仍然有点困惑:

然后,您在该对象上调用一个方法,告诉它将一个整数对象附加到自身。这会修改列表对象的内容,但不会触及命名空间,也不会触及整数对象。

我也相信部分答案可以在这里找到:Python;名称绑定不是对象引用?,但我仍在寻找更多的见解。

4

1 回答 1

2

在python中,如果a=1创建一个整数对象并将其绑定到名称a,b=[]创建一个空列表对象并将其绑定到名称b,当我调用eg时会发生什么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包含一个指向整数 object 的指针1

可以将例如 c[0] 视为绑定到列表项的名称吗?

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

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

那么以下内容呢:

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是 object 的别名1,并且e包含指向 object 的指针1。然而,两者都d指向e[0]同一个对象:

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

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

于 2017-05-18T16:49:37.110 回答