在名称对象绑定方面,我在python中创建c = [1]等列表时会发生什么?

djv*_*jvg 7 python name-binding

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

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

我想这会创建一个list-object并将其绑定到名称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?
Run Code Online (Sandbox Code Playgroud)

list-object(named e)的内容是对被调用的整数对象d或新的整数对象的引用吗?

我想答案就在于Lundh先生的引用,来自上面提到的来源,但我仍然有点困惑:

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

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

Chr*_*ean 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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

Py_INCREF(a->ob_item[i]);
return a->ob_item[i];
Run Code Online (Sandbox Code Playgroud)

那么以下内容呢:

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?
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,变量d是对象的别名1,并且e包含指向对象的指针1。然而,两者de[0]指向同一个对象:

>>> a = 10
>>> b = [a]
>>> id(a) == id(b[0])
True
>>> 
Run Code Online (Sandbox Code Playgroud)

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