2011-08-15 26 views
2

は、私は次のコードを書きましたが予期せず予期しない結果が

a = node("", s, None) 
b = node("", s, a) 
print a.checklist 

を、それはprint文の出力としてAとBのオブジェクトの両方を示してい。 私はPythonの初心者です。だから、おそらくいくつかのばかげた間違いがあります。

ありがとうございます。

+1

'self.checklist = parent.checklist'は、parent = Noneの場合にAttributeErrorを発生させるはずです。if文に記述する必要があります。また、 '!='の代わりに 'parent is not None'を使用し、if文(1つの条件付き)でparanthesesを使用しないでください。 – utdemir

+0

申し訳ありません。それはコピーエラーでした。修正されました。 – mihsathe

答えて

6

あなたはself.checklist = parent.checklistを実行します。つまり、両方のインスタンスが同じリストを共有します。両方とも自分自身を追加するので、印刷すると両方のインスタンスが表示されます。

おそらく親リストのコピーを作成したかったでしょうか? self.checklist = parent.checklist[:]

+0

はい。それは仕事をした。どうもありがとう。この静的な振る舞いについて知らなかった。 – mihsathe

1

スライス表記[:] これはリストのコピーを作成しますが、リストに他のリストが含まれている場合、それらのリスト自体は新しいオブジェクトではなく参照としてコピーされます。例えば

::

>>> a = [1,2,3] 
>>> b = [4,5,6] 
>>> x = [a,b] 
>>> y = x[:] 
>>> x 
[[1, 2, 3], [4, 5, 6]] 
>>> y 
[[1, 2, 3], [4, 5, 6]] 
>>> a.append(66) 
>>> x 
[[1, 2, 3, 66], [4, 5, 6]] 
>>> y 
[[1, 2, 3, 66], [4, 5, 6]] 

    ^^^^^^^^^ unexpectedly y has an updated a inside it, even though we copied it off. 


>>> import copy 
>>> y = copy.deepcopy(x) 
>>> a.append(77) 
>>> x 
[[1, 2, 3, 44, 55, 66, 77], [4, 5, 6]] 
>>> y 
[[1, 2, 3, 44, 55, 66], [4, 5, 6]] 

        ^^^^^ y is a seperate object and so are all its children 

あなたは、オブジェクトyのメモリアドレスを確認するために、ID(y)を使用することに興味があるかもしれません。

+0

それをコピーするにはどうしたらいいですか? – mihsathe

+0

私はあなたが何を意味するか分かりません。オブジェクトの接続されていないコピーを作成し、子オブジェクトがないことを100%確信していない場合は、copy.deepcopyを使用します。一般的に、無関係のコピーを必要とするたびに、deepcopyを使用します。しかし、一般的に、変更可能なオブジェクトをコピーすることは、それを別の方法 –

関連する問題