python3.1.1中数组引用的初学者问题

2024-10-01 04:46:40 发布

您现在位置:Python中文网/ 问答频道 /正文

作为python编程初学者课程最后一个作业的一部分,我被分配了一个旅行销售员问题。我决定使用递归函数来查找每个置换和目的地之间的距离之和,但是,我在引用方面有很多问题。不同实例中的置换数组和TSP的主函数似乎指向同一个引用。在

from math import sqrt
    class TSP:
        def __init__(self):
            self.CartisianCoordinates = [['A',[1,1]], ['B',[2,2]], ['C',[2,1]], ['D',[1,2]], ['E',[3,3]]]
            self.Array = []
            self.Max = 0
            self.StoredList = ['',0]
        def Distance(self, i1, i2):
            x1 = self.CartisianCoordinates[i1][1][0]
            y1 = self.CartisianCoordinates[i1][1][1]
            x2 = self.CartisianCoordinates[i2][1][0]
            y2 = self.CartisianCoordinates[i2][1][1]
            return sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2))

    def Evaluate(self):
        temparray = []
        Data = []
        for i in range(len(self.CartisianCoordinates)):
            Data.append([])
        for i1 in range(len(self.CartisianCoordinates)):
            for i2 in range(len(self.CartisianCoordinates)):
                if i1 != i2:
                    temparray.append(self.Distance(i1, i2))
                else:
                    temparray.append('X')
            Data[i1] = temparray
            temparray = []
        self.Array = Data
        self.Max = len(Data)
    def Permute(self,varray,index,vcarry,mcarry): #Problem Class
        array = varray[:]
        carry = vcarry[:]
        for i in range(self.Max):
            print ('ARRAY:', array)
            print (index,i,carry,array[index][i])
            if array[index][i] != 'X':
                carry[0] += self.CartisianCoordinates[i][0]
                carry[1] += array[index][i]
                if len(carry) != self.Max:
                    temparray = array[:]
                    for j in range(self.Max):temparray[j][i] = 'X'
                    index = i
                    mcarry += self.Permute(temparray,index,carry,mcarry)
                else:
                    return mcarry
        print ('pass',mcarry)
        return mcarry
    def Main(self):
        out = []
        self.Evaluate()
        for i in range(self.Max):
            array = self.Array[:] #array appears to maintain the same reference after each copy, resulting in an incorrect array being passed to Permute after the first iteration.
            print (self.Array[:])
            for j in range(self.Max):array[j][i] = 'X'
            print('I:', i, array)
            out.append(self.Permute(array,i,[str(self.CartisianCoordinates[i][0]),0],[]))
        return out


SalesPerson = TSP()
print(SalesPerson.Main())

如果您能帮助我解决我遇到的参考问题,我将不胜感激。谢谢您。在


Tags: inselfforindexdefrangearraymax
1条回答
网友
1楼 · 发布于 2024-10-01 04:46:40

对列表进行切片(如您所做的那样使用[:])不会创建深层副本,而是会创建浅拷贝。这意味着,如果列表包含对其他列表的引用,则副本将包含相同的引用而不是对新列表的引用。它的元素或元素本身不是复制的,而是另一种方式。在

你想要的是一份深度拷贝。而不是

array = self.Array[:]

试试看

^{pr2}$

您需要import copy。在

相关问题 更多 >