首先,我编写了第一个代码示例,但它无法正常工作。我更喜欢第一个样本,但只有第二个样本正常工作。我不知道为什么第一个样本不会改变原始数组,但第二个样本不会。区别在哪里?
第一个样本:
import heapq
def heap_sort(tab):
heap = []
for i in tab:
heapq.heappush(heap, i)
tab = [heapq.heappop(heap) for _ in xrange(len(heap))]
temp_tab = [4, 3, 5, 1]
heap_sort(temp_tab)
print temp_tab
打印:
[4, 3, 5, 1]
第二个样本:
import heapq
def heap_sort(tab):
heap = []
for i in tab:
heapq.heappush(heap, i)
for i, _ in enumerate(tab):
tab[i] = heapq.heappop(heap)
temp_tab = [4, 3, 5, 1]
heap_sort(temp_tab)
print temp_tab
打印:
[1, 3, 4, 5]
答案 0 :(得分:3)
您还可以使用[:]
,这将更改传入的原始对象:
def heap_sort(tab):
heap = []
for i in tab:
heapq.heappush(heap, i)
tab[:] = [heapq.heappop(heap) for _ in xrange(len(heap))]
因此,您不是将名称tab
重新分配给新对象,而是实际更新原始tab
对象。
您也可以使用生成器表达式而不是构建整个列表:
tab[:] = (heapq.heappop(heap) for _ in xrange(len(heap)))
答案 1 :(得分:2)
因为您只是在函数内部重新分配名为tab
的新名称,所以它不会影响您定义的全局名称tab
。
所以,改变你的函数实际返回值,将起作用:
import heapq
def heap_sort(tab):
heap = []
for i in tab:
heapq.heappush(heap, i)
# return the supposed tab value
return [heapq.heappop(heap) for _ in xrange(len(heap))]
tab = [4, 3, 5, 1]
# assign the tab to the returned value
tab = heap_sort(tab)
print tab
[1, 3, 4, 5]
供您参考,阅读How do I pass a variable by reference?将帮助您了解引用如何在Python中工作。
答案 2 :(得分:-1)
试试这个:
>>> def heap_sort(tab):
heap=[]
for i in tab:
heapq.heappush(heap,i)
heapq.heapify(heap)
return heap
>>> t=heap_sort(t)
>>> print(t)
[1, 3, 5, 4]