2017-01-03 11 views
0

これでは、 2番目のネストされたリストの最初の要素を変更したいですが、この場合2dリストの要素を変更する方法

L1=list('| |') 
L2=[L1,L1] 
print L2 

>>>[ [ '|', ' ', ' ', '|' ], [ '|', ' ', ' ', '|' ] ] 

L2[1][0]='@' 
print L2 

>>>[ [ '@', ' ', ' ', '|' ], [ '@', ' ', ' ', '|' ] ] 

その両方のネストされたリストを変更してください。 私はどこに行くのですか?

+2

二行目は 'L2をお読みください= [L1、L1] '? –

+0

Pythonのリストでは、ポインタに似ています。 http://stackoverflow.com/questions/240178/list-of-lists-changes-reflected-across-sublists-nexpectedly –

答えて

0

問題はこれです:

L1 = list('| |') 
L2 = [L1, L1] 

for item in L2: 
    print(id(item)) # -> twice the same id. 

あなたは同じリストに2つの参照を含む新しいリストを作成します。このリストへの変更はL2の両方の項目に反映されます。予想通り

L2 = [list('| |'), list('| |')] 

L2[1][0]='@' 

作品:あなたはおそらく何をしたいのか

はこれです。

2

私はあなたの第二のラインを想定しては、これを行うことにより

L2 = [L1, L1] 

である、あなたは二回、L2にL1値を渡すのではなく、参照していません。彼らは同じ場所を指しています。 id(L2[0][0])id(L2[1][0])と同じです。

代替

import copy 
L2 = [L1, copy.copy(L1)] 
0

あなたはその中で同じリストの2でリストを作成する場合、次の2つの独立したサブリストを作成していない - むしろ、あなたは同じリストへの参照のリストを作成していますメモリ内にある。そのため、1を変更し、他の変更:

In [18]: L1=list('| |') 

In [19]: id(L1) 
Out[19]: 4388545160 

In [20]: L2 = [L1, L1] 

In [21]: id(L2) 
Out[21]: 4389336520 

In [22]: for sub in L2: print(id(sub)) 
4388545160 
4388545160 

あなたのアイテムの再割り当ては、何か他のものにそれを再割り当てすることなく、メモリ内のサブリストを変更インプレース操作です。これはあなたの行動につながります

0

2番目のリストの元のリストで作業する代わりに、リストスライシングを使用して元のリストのコピーを処理できます。リストのスライスがなければ

:詳細は、以下の例を見てみましょう

>>> l1 = ['a', 'b'] 
>>> l2 = [l1, l1] 
>>> 
>>> l2[1][0] = 'x' 
>>> l2 
[['x', 'b'], ['x', 'b']] # both sub-lists are changed 

、リストのスライスと:

>>> l3 = ['a', 'b'] 
>>> l4 = [l3[:], l3[:]] 
>>> 
>>> l4[1][0] = 'x' 
>>> l4 
[['a', 'b'], ['x', 'b']] # only the second sub-list is changed 
関連する問題