2017-11-17 8 views
1

私は簡単な問題を抱えています。私は非常に明白な間違いをしていると確信していますが、私はそれを見つけることができません。私はl_oldを反復を受ける前にlのコピーにします。私は次のPythonスクリプトを持っています。Pythonはネストされたリストで値渡しですか?

import random 
def runtest(n,steps): 
    l=[] 
    for i in range(n): 
     sublist=[] 
     for j in range(n): 
      sublist.append(0) 
     l.append(sublist) 


    for k in range(n-1): 
     i = random.randint(0,n-1) 
     j = random.randint(0,n-1) 
     while(l[i][j]==1): 
      i = random.randint(0,n-1) 
      j = random.randint(0,n-1) 
     l[i][j]=1 
    l_old = list(l) 
    print("L_OLD BEFORE ITERATION", l_old) 
    for k in range(steps): 
     for i in range(n): 
      for j in range(n): 
       num = 0 
       if i is not 0: 
        num+=l[i-1][j] 
       if i is not n-1: 
        num+=l[i+1][j] 
       if j is not 0: 
        num+=l[i][j-1] 
       if j is not n-1: 
        num+=l[i][j+1] 
       if(num > 1): 
        l[i][j]=1 
    print("L_OLD AFTER ITERATION",l_old) 
    return sum([sum(item) for item in l]), l_old, l 

しかし、私の出力は次のようになります。

BEFORE ITERATION [[0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [1, 0, 1, 0, 0], [0, 0, 0, 0, 0], [1, 0, 0, 0, 0]] 
AFTER ITERATION: [[0, 0, 0, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 0, 0]] 

だから、私はllの値のコピーではなく、言及していても変更することです。私は同じ結果をl[:]しようとしました。私は何が欠けていますか?私はそれがネストされたリストであるという事実と関係があると思いますが、ネストされたリストがすべて値でコピーされるように、どのように書くことができますか?

答えて

2

は私が

はい、それはそれは、ネストされたリストだという事実に関係していと思います。あなたは浅いコピーをしました:

l_old = list(l) 

l[:]によるスライシングも浅いコピーです。

しかし、すべてのネストされたリストが値によってコピーされるように書くにはどうすればよいですか?

深いコピーをお試しください:

from copy import deepcopy 
l_old = deepcopy(l) 
関連する問題