Saya mengalami masalah sederhana yang membuat saya frustrasi. Saya yakin saya membuat kesalahan yang sangat jelas, tetapi sepertinya saya tidak dapat menemukannya. Saya ingin l_old menjadi salinan l sebelum menjalani iterasi. Saya memiliki skrip Python berikut.

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

Namun, output saya akan terlihat seperti ini:

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]]

Jadi itu berubah meskipun saya membuat salinan nilai l daripada referensi ke l. Saya mencoba l[:] dengan hasil yang sama. Apa yang saya lewatkan? Saya pikir itu ada hubungannya dengan fakta bahwa itu adalah daftar bersarang, tetapi bagaimana saya bisa menulisnya sedemikian rupa sehingga semua daftar bersarang disalin berdasarkan nilai?

1
rb612 17 November 2017, 06:02

1 menjawab

Jawaban Terbaik

Saya pikir ini ada hubungannya dengan fakta bahwa ini adalah daftar bersarang,

Ya. Anda telah melakukan salinan dangkal:

l_old = list(l)

Mengiris dengan l[:] juga merupakan salinan yang dangkal.

tetapi bagaimana saya bisa menulisnya sehingga semua daftar bersarang disalin berdasarkan nilai?

Coba salinan dalam:

from copy import deepcopy
l_old = deepcopy(l)
2
wim 17 November 2017, 03:05