2017-05-02 3 views
1

私は "3D"配列から立方体を表現するはずの機能を持っていますが、1つのレイヤーは真ん中に正方形を持っています。 I.なぜpythonでリストをコピーしていますか?

def cube(n): 
    list1 = [] 
    list2 = [] 
    list3 = [] 


    for a in range(n+2): 
     list3.append(str('c')) 
    for b in range(n+2): 
     list2.append(list(list3)) 
    for c in range(n+2): 
     list1.append(list(list2)) 


    for d in range(1,n+1): 
     for e in range(1,n+1): 
      list1[0][d][e]='h' 
    return list1 

pprint.pprint(cube(2)) 

>>> 

[[['c', 'c', 'c', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'c', 'c', 'c']], 

[['c', 'c', 'c', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'c', 'c', 'c']], 

[['c', 'c', 'c', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'c', 'c', 'c']], 

[['c', 'c', 'c', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'c', 'c', 'c']]] 

が、私はこれをしたいと思います:

>>> 

[[['c', 'c', 'c', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'h', 'h', 'c'], 
['c', 'c', 'c', 'c']], 

[['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c']], 

[['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c']], 

[['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c'], 
['c', 'c', 'c', 'c']]] 

第1層のみで時間。なぜPythonはこれをやっているのですか?

+0

を明示的にリストをコピーしている.... –

+0

'リスト(リスト1)は'コピーを返します。 –

+2

さらに、 'list(alist)'は_shallow_コピーを作成します。必要な動作には "深い"コピーが必要です。 –

答えて

2

あなたが望むものを得るために最小限の変更があります。まず、

from copy import deepcopy 

を追加次に置き換えますと

list1.append(list(list2)) 

list1.append(deepcopy(list2)) 
関連する問題