python - 合并排序递归中的 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)
解决方案
您的代码中的问题是何时len(alist)
不大于一。在这种情况下,没有定义任何变量 mid、leftHalf 或 rightHalf。语句中的变量if
可以在 Python 中的语句之外引用,但这里的问题是,如果条件计算结果为 ,则不会定义这三个变量False
。
添加else
语句并对语句后面的变量 ( , , )赋予值将解决此问题(仅添加不带变量的变量并不能解决问题)。否则,您可以使用一些默认值在语句之前定义三个变量。mid
leftHalf
rightHalf
if
else
if
推荐阅读
- java - Kafka的主类在哪里?
- c# - 获取 href 属性值时 HTMLAgilityPack 中的错误。C#
- python - 如何获取新插入的数据行和flask-mysqldb的数据对象?
- python - 绘制代表不同时间间隔的 Plotly 烛台
- python - * 不支持的操作数类型:“map”和“float”
- javascript - Web Audio API - 如何将音频缓冲区保存到包含所有更改的文件中?
- python - discord.py 用户嵌入标题输入只取一个词
- python - 查找给定位置的邻居
- javascript - 交换css字体时是否会发出js事件?
- mysql - (SQL) unique(set) 返回真还是假?