2016-12-05 3 views
1

は、問題は、私はそれも何とかlist[1].xを・修正されPythonのリストの逢引

list[0].x=100 

を更新するときにということです!私はそれを更新していないので0に残っている必要があります

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

append()は同じオブジェクトを作成して、位置0と1のメモリ内の同じ位置を指していますか?なぜ2つの異なるオブジェクトを作成すると問題が解決するのですか?

+2

あなたは二度リストに同じオブジェクトを追加しています。変更すると、両方のインデックスで変更されます。 –

+0

'append'は同じオブジェクトを同じメモリ位置に作成していません。同じオブジェクトを明示的に追加しています。 –

答えて

3

現在のコードでは、xyはクラスレベルの属性です。私はそれらをインスタンスレベルの属性にしたいと思う。もしそうなら、__init__()でそれらを設定:あなたは二度リストに同じcoorを追加する場合

class Coordinates: 

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

はもっと重要な、coorのいずれかの変異は、「両方」の座標に反映されます(リストがちょうど保持されるので、リストの両方の位置で同じ基礎座標を参照)。たぶんあなたは2つの独立した座標インスタンスを作成する代わりに、このようなものを求めていますか?

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は両方の位置を変更するでしょうか?素晴らしい応答!行く方法として 'list.append(Coordinates())'を実装しました。 – Joe

+0

@Joeまあ...その例はちょっと違います。あなたは**完全に新しいオブジェクト(整数 '100')を** [0]に割り当てます**。最初の例では、同じオブジェクト( 'coor')をリストに2回追加してから、そのオブジェクトを変更していました。 – FMc

関連する問題