自变量在分配给变量时发生变化

时间:2019-01-10 17:45:37

标签: python python-3.x

我创建了类Sorter,该类将self.list中的变量__init__设置为等于给定参数。然后,我创建了一个函数selectionSort,该函数应将self.list的值复制到新变量unsortedList中。可以解决,但是当我然后更改unsortedList时,self.list变量也会更改。 这是我的代码:

class Sorter:
        def __init__(self, list):
                self.list = list

        def selectionSort(self):
                unsortedList = self.list
                sortedList = []
                indexSmallest = 0

                while len(unsortedList)>0:
                        for i in range(len(unsortedList)):
                                if unsortedList[i] <= unsortedList[indexSmallest]:
                                        indexSmallest = i
                        sortedList.append(unsortedList[indexSmallest])
                        unsortedList.pop(indexSmallest)
                        indexSmallest = 0
                return sortedList

sorter = Sorter([2,6,1,8,5])
print(sorter.selectionSort())

我希望self.list与调用selectionSort()函数之前的相同,但是得到的结果是一个空的self.list变量。

2 个答案:

答案 0 :(得分:2)

使用以下任一方法:

#1
unsortedList = self.list.copy()

#2
unsortedList = self.list[:]

#3
import copy
unsortedList = copy.deepcopy(self.list)

说明:

当您通过=进行分配时,实际上是指同一列表,只是该列表具有2个不同的名称。

要避免这种情况,请使用#1或#2方法->您将需要.copy()内置函数或使用[:]

对于#3,在浅表复制还不够的情况下使用它,因为列表本身可能包含可变对象。
要进一步了解复制与深度复制,请访问并阅读here

答案 1 :(得分:1)

正在发生的事情是,当您设置unsortedList = self.list时,Python不想复制所有值,因为这样做可能会很昂贵。相反,它只是使两个变量都指向相同的内存区域,因此,当您更改一个变量时,它也会更改另一个变量。

要进行复制,您可以进行unsortedList = self.list[:]

编辑,请参见this thread,以获取更多信息。