我有一个生成数字列表然后对其进行排序的代码。排序功能有效但我需要在排序后打印未排序的列表。这就是为什么我把print函数打印出未排序的,而是打印排序列表。我以为我通过将未排序的列表分配给变量来存储未排序的列表,然后尝试将其打印到最后。任何想法为什么它打印排序列表而不是未排序?我没有把GenerateNumbers()函数放到"数字"变量未分类的数字列表。我使用插入排序。
def InsertionSort(sort_list):
print("Sorting numbers...")
for i in range(0, len(sort_list)-1):
for j in range(i+1,0,-1):
if(sort_list[j] < sort_list[j-1]):
temp = sort_list[j-1]
sort_list[j-1] = sort_list[j]
sort_list[j] = temp
print(sort_list)
else:
break
print("Finished sorting.")
print()
return sort_list
numbers = GenerateNumbers()
unsorted = numbers
sort_list = numbers
sorted_numbers = InsertionSort(sort_list)
print("unsorted list:", numbers)
print("sorted list:", sorted_numbers)
答案 0 :(得分:2)
您有三个分配命令
numbers = GenerateNumbers()
unsorted = numbers
sort_list = numbers
您认为您有三个不同的列表副本,但您没有。由于列表是可变类型,因此Python为相同的列表创建了三个不同的名称。因此你的困惑。更改其中一个名称会立即更改所有内容。您需要复制列表。有几种方法可以做到这一点。最简单的两种方法是
numbers = GenerateNumbers()
unsorted = numbers[:]
sort_list = numbers[:]
和
numbers = GenerateNumbers()
unsorted = list(numbers)
sort_list = list(numbers)
还有其他方法,例如deepcopy()
,它们对更复杂的数据结构很有用,但这两种方法中的一种就足以满足这种情况。
答案 1 :(得分:2)
当你打电话时
unsorted = numbers
sort_list = numbers
你实际上并没有复制列表,只是将引用复制到列表中。 unsorder
和sort_list
都指向内存中的相同列表。
要复制列表,您可以执行以下操作:
sort_list = list(numbers)
现在sort_list指向内存中的新列表,您可以更改sort_list
而不更改numbers
。
答案 2 :(得分:1)
您的函数对列表进行了排序,因此sorted_numbers is sort_list
,分配sort_list = numbers
只是重命名,它不会创建新列表,因此sort_list
将是&# 34;同样的&#34; as&#34;未分类&#34;。因此,当您对sort_list
进行排序时,unsorted
也将被排序。
您可以通过在数字上调用list
来解决此问题,这将导致python创建副本。
numbers = GenerateNumbers()
unsorted = list(numbers) # creates a copy
sort_list = numbers
sorted_numbers = InsertionSort(sort_list)
print("unsorted list:", numbers)
print("sorted list:", sorted_numbers)