变量变化而不被触及

时间:2014-06-11 19:32:30

标签: python list math matrix copy

我对Python很陌生,但这很奇怪。 所以,我有一个矩阵(列表列表),我把它传递给一个函数(creaMatrixVNS)。

def creaMatrixVNS(best_matrice, time):
    matrice = best_matrice
    sol_init_ass = assegnamento(matrice)

    iteration = 1 #numero swap
    counter = 0 #numero iterazioni

    while True:
            temp = matrice

从这一点

            for x in xrange(0,iteration):
                    temp = swap(temp, sol_init_ass)
到目前为止,我看到我的变量matrice发生了变化并被设置为temp的值。而且我不知道为什么。这是该功能的第二部分。

            time2 = creaSoluzione(temp)

            if time2 < time:
                    time = time2
                    matrice = temp
                    if counter == 9:
                            break
                    else:
                            counter += 1
            else:
                    if iteration < 3:
                            iteration += 1
                            counter = 0
                    else:
                            break

    print(time)
    return matrice

其他功能:

def swap(matriceInput, lista):
        result = matriceInput

        i1, j1 = giveMeAcouple(lista)
        i2, j2 = giveMeAcouple(lista)

        while i1 == i2 and j1 == j2:
                i1, j1 = giveMeAcouple(lista)
                i2, j2 = giveMeAcouple(lista)

        result[i1][j1], result[i2][j2] = result[i2][j2], result[i1][j1]

        return result

def giveMeAcouple(sol_init_ass):
        j1 = randint(0,len(sol_init_ass)-1)
        while len(sol_init_ass[j1]) <= 0:
                j1 = randint(0,len(sol_init_ass)-1)

        i1 = randint(0,len(sol_init_ass[j1]) - 1)

        return sol_init_ass[j1][i1], j1


def assegnamento(matrice):
        listElementi = []
        temp = []
        n = len(matrice)
        m = len(matrice[0])

        for i in xrange(0,m): #Per ogni colonna
                for j in xrange(0,n): #Per ogni riga
                        if matrice[j][i] != 0:
                                temp.append(j)
                listElementi.append(temp)
                temp = []

        return listElementi


def creaSoluzione(matrix):
        n = len(matrix)
        m = len(matrix[0])

        max = 0
        for j in xrange(0,m):
                temp = 0
                for i in xrange(0,n):
                        temp += matrix[i][j]
                #print(temp)

                if temp > max:
                        max = temp
        return max

任何提示?感谢

2 个答案:

答案 0 :(得分:2)

执行matrice = best_matrice时,您只需创建一个名为matrice的新引用,该引用指向与引用best_matrice相同的对象。

查看Deep copy a list in Python的已接受答案,以获取Python中列表深层副本的示例。

答案 1 :(得分:-1)

在不导入的情况下“深入”复制列表的快速简写是使用:切片运算符。在您的情况下,您需要使用它两次来显式复制列表及其内容,而不是复制对内部列表的引用。

一个简单的例子是new_lst = old_lst[:]来复制old_lst的所有内容 - 在你的情况下,你想做matrice = best_matrice[:][:],从而复制内部列表的内容。