2012-04-17 14 views
1

可能性の重複:
Python list problem奇妙な行動

私はPythonでリストの振る舞いを理解していない:

>>> a1 = [[0,0],[0,0]] 
>>> a2 = [[0]*2]*2 
>>> a1 
[[0, 0], [0, 0]] 
>>> a2 
[[0, 0], [0, 0]] 
>>> a1[0][0] = 1 
>>> a2[0][0] = 1 
>>> a1 
[[1, 0], [0, 0]] 
>>> a2 
[[1, 0], [1, 0]] 

なぜ一つの要素の割り当て他の要素に影響を与えるか?答えをありがとう!

+0

[多次元リスト]に関する関連するPython FAQ(http://docs.python.org/faq/programming.html#how-do-i-create-a-multidimensional-list) –

答えて

6

リストを掛けると、リストへの参照がコピーされますが、リストのコピーは作成されません。リストは変更可能なので、変更すると、リストへのすべての参照が変更されます。 ASCII技術の面では

a1 --- [list1, list2] --- list1 = [0, 0] 
         --- list2 = [0, 0] 

a2 --- [list3, list3] --- list3 = [0, 0] 

あなたLIST3を変更すると両方の位置に影響を与えることをはっきりと見ることができます。

あなたが参照をコピーせずに可変長のリストを作成したい場合は、代わりにこのような何か行う必要がありますたびに新しい要素を作成し、コピーではなくするために、ここで

>>> a2 = [[0]*2 for _ in range(2)] 
>>> a2[0][0] = 1 
>>> a2 
[[1, 0], [0, 0]] 

我々はlist comprehensionを使用していることを古い要素への参照。反復したい既存の可変オブジェクトがあるより複雑な状況では、the copy moduleを使用するとよいでしょう。

の操作はまだOKです。つまり、intはPythonでは変更できないため変更できません。同じオブジェクトへの参照がある場合は問題ありません。

+0

お返事ありがとうございます。それは私の秋です。私は答えdocs.python.orgを見つけようとしましたが、見つけませんでした。この非常に単純な質問を申し訳ありません。 – maxsocl

+0

@misokolskyこれがあなたの質問に答えるならば、[回答を受け入れる](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)まで気軽に。 –