Python 合并排序递归中的未绑定本地错误

Python 合并排序递归中的未绑定本地错误,python,python-3.x,recursion,Python,Python 3.x,Recursion,读过之后,我从内存中为mergeSort编写了代码。我犯了一个错误,没有在if语句后缩进,没有包括mergeSort的递归调用。我得到了相同的未排序数组[54、26、77、31、44、55、20、93、17],解释器没有错误 我回顾了引用,然后意识到我没有进行递归调用(在下面的代码中注释掉)。我将它们包括在内,并得到以下错误: UnboundLocalError: local variable 'leftHalf' referenced before assignment 在递归调用merge

读过之后,我从内存中为
mergeSort
编写了代码。我犯了一个错误,没有在
if
语句后缩进,没有包括
mergeSort
的递归调用。我得到了相同的未排序数组
[54、26、77、31、44、55、20、93、17]
,解释器没有错误

我回顾了引用,然后意识到我没有进行递归调用(在下面的代码中注释掉)。我将它们包括在内,并得到以下错误:

UnboundLocalError: local variable 'leftHalf' referenced before assignment
在递归调用
mergeSort
之前,我不明白为什么这不是一个问题。我还认为Python不象C++那样,在代码>变量> > />代码>语句中,可以引用外部语句。 我知道,
if
语句之后的所有内容都应该缩进,这样才能正确执行,但在遇到这个问题后,我想理解Python

def合并排序(列表):
如果len(alist)>1:
mid=len(alist)//2#选择较短的一端作为左侧
leftHalf=alist[:mid]
rightHalf=alist[中间:]
#合并排序(左半部分)
#合并排序(右半部分)
i=0
j=0
k=0
而i

我查看了,但无法找出我的情况与问题中的情况有多相似,因为我没有定义新函数。

代码中的问题是
len(alist)
不大于1。在这种情况下,没有定义mid、leftHalf或righhalf变量。
if
语句中的变量可以在Python语句之外引用,但这里的问题是,如果条件的计算结果为
False
,则不会定义这三个变量


if
语句之后添加
else
语句和给变量赋值(
mid
leftHalf
righhalf
)可以解决这个问题(只添加一个
else
而不添加变量不能解决问题)。否则,您可以使用一些默认值在
if
语句之前定义三个变量。

问题在于您错误地复制了函数。从i=j=k=0开始,它们都应包含在if函数中。压痕是错误的

def mergeSort(alist):
    if len(alist) > 1:
        mid = len(alist) // 2  # pick shorter end as left
        leftHalf = alist[:mid]
        rightHalf = alist[mid:]

        # mergeSort(leftHalf)
        # mergeSort(rightHalf)

        i = 0
        j = 0
        k = 0

        while i < len(leftHalf) and j < len(rightHalf):
        if leftHalf[i] < rightHalf[j]:
            alist[k] = leftHalf[i]
            i += 1
        else:
            alist[k] = rightHalf[j]
            j += 1
        k += 1

        # right side was all smaller and is done. Fill all left 
        while i < len(leftHalf):
            alist[k] = leftHalf[i]
            i += 1
            k += 1

        # left side was all smaller and is done. Fill all right
        while j < len(rightHalf):
            alist[k] = rightHalf[j] 
            i += 1
            k += 1

alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)
def合并排序(列表):
如果len(alist)>1:
mid=len(alist)//2#选择较短的一端作为左侧
leftHalf=alist[:mid]
rightHalf=alist[中间:]
#合并排序(左半部分)
#合并排序(右半部分)
i=0
j=0
k=0
而i
请阅读有关的信息。您还可以使用它来帮助逐步可视化代码的执行。想一想,当函数只使用一个项调用时会发生什么……这是一种教递归的糟糕方法。从上周开始,我演示了如何使用带有函数风格的递归编写
mergesort
。如果您有后续问题,请告诉我^^^ Tomerikoo-谢谢我不知道Python-tutor。谢谢-我问了一个后续问题您的链接问题。主要询问功能性遗产的含义以及您希望人们避免的问题。