2016-12-05 72 views
1

我有了這個代碼Python列表分配

class coordenates: 
    x = 0    
    y = 0    

coor = coordenates() 
coor.x=0 
coor.y=0 

list = [] 
list.append(coor) 
list.append(coor) 

現在的問題是,當我更新

list[0].x=100 

它也對矯正list[1].x莫名其妙!

print str(list[0].x) 
>> 100 
print str(list[1].x) 
>> 100 

因爲我沒有更新它,所以必須保留在0之內。是append()創建相同的對象指向位置0和1在內存中的相同位置?爲什麼創建2個不同的對象解決了這個問題?

+2

要附加同一對象添加到列表兩次。如果你改變它,它會在兩個索引處改變。 –

+0

'append'不是在相同的內存位置創建相同的對象,*你*明確地追加同一個對象。 –

回答

3

在您當前的代碼中,xy是類級屬性。我懷疑你想讓它們成爲實例級屬性。如果是這樣,將它們設置在__init__()

class Coordinates: 

    def __init__(self): 
     self.x = 0    
     self.y = 0    

更重要的是,如果您將追加相同coor到列表兩次,coor的任何突變將在「既」座標反映(因爲列表只是拿着在列表中的兩個位置參考相同的底層座標)。也許你想要這樣的東西,而不是創建兩個獨立的座標實例?

list = [] 
list.append(Coordinates()) 
list.append(Coordinates()) 

你可以看到你問題的解釋與此代碼:

c = Coordinates() 
cs = [] 
cs.append(c) 
cs.append(c) 

for c in cs: 
    print id(c) # Both elements of the list refer to the same object. 
+0

可能是最好的方法。它也許值得一提的是'copy'模塊。 – pbreach

+0

因此,如果我做'temp = 0,list.append(temp),list.append(temp)'list [0] = 100會同時修改兩個位置? btw驚人的反應!我實現了'list.append(Coordinates())'作爲要走的路。 – Joe

+0

@Joe呃......這個例子有點不同。您正在**將一個全新的對象(一個整數爲100)分配給'[0]'元素。在最初的例子中,我們將兩個相同的對象('coor')附加到列表中,然後對基礎對象進行變異。 – FMc