在python

时间:2017-07-11 08:56:44

标签: python list sorting random printing

我有一个生成数字列表然后对其进行排序的代码。排序功能有效但我需要在排序后打印未排序的列表。这就是为什么我把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)

3 个答案:

答案 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

你实际上并没有复制列表,只是将引用复制到列表中。 unsordersort_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)