【发布时间】:2018-11-18 03:47:53
【问题描述】:
所以我定义了一个函数,如果它是由它的孤独实现的,那么它在线性数组上进行合并排序时效果很好,但是如果我把它放到一个类中它就会出错。我认为这是我不太了解课程如何运作的一个很好的例子。可能与命名空间管理有关(?)。
见下文:
def sort(array):
print('Splitting', array)
if len(array) > 1:
m = len(array)//2
left = array[:m]
right = array[m:]
sort(left)
sort(right)
i = 0
j = 0
k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
array[k] = left[i]
i += 1
else:
array[k] = right[j]
j += 1
k += 1
while i < len(left):
array[k] = left[i]
i += 1
k += 1
while j < len(right):
array[k] = right[j]
j += 1
k += 1
print('Merging', array)
arr = [1,6,5,2,10,8,7,4,3,9]
sort(arr)
产生预期的正确输出:
Splitting [1, 6, 5, 2, 10, 8, 7, 4, 3, 9]
Splitting [1, 6, 5, 2, 10]
Splitting [1, 6]
Splitting [1]
Merging [1]
Splitting [6]
Merging [6]
Merging [1, 6]
Splitting [5, 2, 10]
Splitting [5]
Merging [5]
Splitting [2, 10]
Splitting [2]
Merging [2]
Splitting [10]
Merging [10]
Merging [2, 10]
Merging [2, 5, 10]
Merging [1, 2, 5, 6, 10]
Splitting [8, 7, 4, 3, 9]
Splitting [8, 7]
Splitting [8]
Merging [8]
Splitting [7]
Merging [7]
Merging [7, 8]
Splitting [4, 3, 9]
Splitting [4]
Merging [4]
Splitting [3, 9]
Splitting [3]
Merging [3]
Splitting [9]
Merging [9]
Merging [3, 9]
Merging [3, 4, 9]
Merging [3, 4, 7, 8, 9]
Merging [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但是,当我尝试在类中使用此函数时出现错误;我认为与命名空间管理有关。见下文:
class MergeSort(object):
def __init__(self, array):
self.array = array
def sort(self):
print('Splitting', self.array)
if len(self.array) > 1:
m = len(self.array)//2
left = self.array[:m]
right = self.array[m:]
sort(left)
sort(right)
i = 0
j = 0
k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
self.array[k] = left[i]
i += 1
else:
self.array[k] = right[j]
j += 1
k += 1
while i < len(left):
self.array[k] = left[i]
i += 1
k += 1
while j < len(right):
self.array[k] = right[j]
j += 1
k += 1
print('Merging', self.array)
x = MergeSort([1,6,5,2,10,8,7,4,3,9])
x.sort()
产生错误输出:
Splitting [1, 6, 5, 2, 10, 8, 7, 4, 3, 9]
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-15-89509f86277e> in <module>()
1 x = MergeSort([1,6,5,2,10,8,7,4,3,9])
----> 2 x.sort()
<ipython-input-14-2bba116f00ce> in sort(self)
11 right = self.array[m:]
12
---> 13 sort(left)
14 sort(right)
15
NameError: name 'sort' is not defined
在谷歌搜索之后,我最初的直觉是通过添加前缀 self. 来更改子例程 sort(left) 和 sort(right),但这会产生位置参数错误。希望对我在这里不理解的内容发表一两条评论。如果我的问题不愚蠢,请为好票欢呼,如果是,则为反对票。
【问题讨论】:
-
您对排序的递归调用应该是
self.sort。所以,不应该是sort(left)和sort(right),而是self.sort(left)和self.sort(right)。 -
@TobiasBrösamle 不,这行不通。
sort不接受参数(除了self)。而且,正如 OP 在问题中所说,他们已经尝试过“添加前缀自我”。 -
@TobiasBrösamle 如果我这样做,我会得到位置参数错误。
-
顺便说一下,描述你写的东西而不是显示代码,然后描述错误而不是显示实际的异常,往往会导致人们误解你的问题,除非他们非常仔细地阅读它(如在第一条评论和此处的一个答案中看到),并且如果您犯了一个对其他人来说可能很明显但对您来说并不明显的简单错误,那么人们也无法对其进行调试。
标签: python algorithm class namespaces mergesort