2017-05-18 1 views
6

Nach http://www.effbot.org/zone/python-objects.htm Lese ich mit dieser Frage gelassen bin: wenn a=1 schafft ein ganzes Zahl-Objekt und bindet es an den Namen a, b=[] erstellt ein leeres Liste-ObjektWas passiert, wenn ich eine Liste wie c = [1] in Python in Bezug auf Namensobjektbindungen anlege?

In Python, und bindet es b zu nennen, was passiert, wenn ich zB anrufe c=[1]?

Ich nehme an, das erstellt ein List-Objekt und bindet es an den Namen c, aber wie wird die 1 genau behandelt? Wie sieht der eigentliche Inhalt des Listenobjektes unter der Haube aus? Besteht es aus einem Integer-Objekt oder einem Verweis auf ein "separates" Integer-Objekt? Ist es in Ordnung, an z.B. c[0] als Name an ein Listenelement gebunden?

Und was ist mit dem folgenden:

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? 

Wird der Inhalt des Liste-Objekts (e genannt) ein Verweis auf das ganzen Zahl-Objekt namens d oder ein neues Ganzzahl-Objekt?

Ich denke, die Antwort liegt in diesem Zitat von Herrn Lundh, von der Quelle oben erwähnt, aber ich bin immer noch ein klein wenig verwirrt:

Sie dann auf das Objekt eine Methode aufrufen, zu sagen Er fügt ein Integer-Objekt an sich selbst an. Dadurch wird der Inhalt des Listenobjekts geändert, der Namespace wird jedoch nicht berührt und das Integer-Objekt wird nicht berührt.

Auch ich glaube, ein Teil der Antwort ist hier zu finden: Python; name bindings are not object references?, aber ich bin immer noch auf der Suche nach mehr Einblick.

Antwort

2

in Python, wenn ein ganze Zahl a=1-Objekt erstellt und bindet es an den Namen ein, erstellt b=[] ein leeres Liste-Objekt und bindet es an Namen b, was passiert, wenn ich beispielsweise nennen c=[1]?

Wenn Sie c zuweisen Ihren aufschluss Python [1] eine Liste Objekt mit einem Zeiger auf ein ganzes Zahl-Objekt zu erstellen, die den Wert von 1 hat. Dies kann durch einen Blick auf, wie die Liste Objekte zu sehen ist unter der Haube dargestellt werden, in C:

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

Wie Sie aus dem obigen Beispiel sehen können, ob_item ist eine Folge von Zeigern, wo jeder Zeiger auf ein PyObject im Speicher. In Ihrem Fall enthält ob_item einen Zeiger, der auf das Integer-Objekt 1 zeigt.

Ist es in Ordnung, an z.B. c [0] als Name an ein Listenelement gebunden?

Nicht wirklich. Wenn Sie c[0] tun, sagen Sie Python, einen Zeiger auf das Objekt mit dem Index 0 zurückzugeben.Dies wiederum kann, indem man beobachten, was passiert, wenn wir Index eine Liste Objekt auf der C-Ebene:

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

Und was ist mit dem folgenden:

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? 

In dem obigen Beispiel, Die Variable d ist ein Alias ​​für das Objekt 1, und e enthält einen Zeiger auf das Objekt 1. Sowohl d und e[0] auf das gleiche Objekt jedoch:

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

Wenn Sie e = [d] Ihren aufschluss Python haben eine Liste zu erstellen, die einen Zeiger auf das Objekt enthält, das d verweist.

Verwandte Themen