以下是我在Python中实现的快速排序:
def quicksort(alist):
if len(alist) <= 1:
return alist
else:
pivot = alist[len(alist)//2]
alist.remove(pivot)
alist1, alist2 = partition(alist, pivot)
return quicksort(alist1) + [pivot] + quicksort(alist2)
def partition(alist, pivot):
alist1 = []
alist2 = []
for e in alist:
if e <= pivot:
alist1.append(e)
else:
alist2.append(e)
return (alist1, alist2)
此实现效果良好。但是看看第6行和第7行,它们分别是alist.remove(pivot)
和alist1, alist2 = partition(alist, pivot)
。如果我试图通过如下重写第7行来将这两行合并为一行代码:alist1, alist2 = partition(alist.remove(pivot), pivot)
,那么我的代码就不起作用了。我得到以下类型错误:
TypeError: 'NoneType' object is not iterable
想知道我为什么会遇到这个错误吗?
remove
方法不返回修改后的列表,在python中,如果函数不返回任何内容,则"返回"None
>>> a = [1, 2, 3]
>>> r = a.remove(2)
>>> r == None
True
alist.remove(pivot)
没有返回实际列表,list.remove
在Python 中返回None
由于alist.remove(pivot)
不返回列表,因此会出现错误。
它不返回任何内容(None
),只是从您的列表中删除pivot
。
因此,您最终传递给partition
方法的是Nonetype
对象,而不是列表。