首页 > 解决方案 > 合并排序递归中的 Unboundlocal 错误

问题描述

mergeSort 阅读后,我从内存中编写了代码。我犯了一个错误,即在语句后不缩进if并且不包括mergeSort. 我得到了相同的未排序数组[54, 26, 77, 31, 44, 55, 20, 93, 17],解释器没有错误。

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

UnboundLocalError: local variable 'leftHalf' referenced before assignment

mergeSort在递归调用之前,我不明白为什么这不是问题。我还认为 Python 不像 C++ 那样if可以在外部引用语句中的变量。

我知道if语句之后的所有内容都应该缩进以确保它是正确的,但是在碰到这个之后想理解 Python。

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)

我查看了问题 1问题 2,无法弄清楚我的情况与问题中的情况有多相似,因为我没有定义新函数。

标签: pythonpython-3.xrecursion

解决方案


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

添加else语句并对语句后面的变量 ( , , )赋予值将解决此问题(仅添加不带变量的变量并不能解决问题)。否则,您可以使用一些默认值在语句之前定义三个变量。midleftHalfrightHalfifelseif


推荐阅读