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; 名称绑定不是对象引用?,但我仍在寻找更多的见解.
在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)
那么以下内容呢:
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?
在上面的例子中,变量d是对象的别名1,并且e包含指向对象的指针1。然而,两者d都e[0]指向同一个对象:
>>> a = 10
>>> b = [a]
>>> id(a) == id(b[0])
True
>>>
Run Code Online (Sandbox Code Playgroud)
当你e = [d]告诉Python构造一个列表,其中包含指向正在d引用的对象的指针时。