我有这个列表,我想根据冒泡排序排序,并且代码中有一个函数(Swap())拒绝工作。我不知道为什么。有代码
score = [92,95,7,5,85,55,789,47,125,3265,88,965,655,3,15,448,0,255,455]
size = len(score)
x = 0
COMPS = size - 1
def swap():
temp = score[x + 1]
score[x + 1] = score[x]
score[x] = temp
# The Sort Array Function
def SortArray():
y = 0
while y < COMPS:
x = 0
while x < COMPS:
if score[x] > score[x + 1]:
#This function not working.
swap()
x += 1
y += 1
#Display Array Function
def displayArray():
x = 0
while x < size:
print(score[x])
x += 1
SortArray()
displayArray()
但是插入swap()代码,因此swap()下的代码并在ifA条件下面的SortArray()下面替换它;像这样:
def SortArray():
y = 0
while y < COMPS:
x = 0
while x < COMPS:
if score[x] > score[x + 1]:
#This Works
temp = score[x + 1]
score[x + 1] = score[x]
score[x] = temp
x += 1
y += 1
然后它工作,所以我想知道为什么不在SortArray()下调用swap()函数
我想知道为什么在SortArray()下不调用swap()函数
实际上,它被称为 - 你可以自己检查在print()
中添加几个using the step debugger调用 - 但它不会做你认为它应该做的事情,因为你混淆了局部和全局变量。
在SortArray()
中,您定义了一个名为x
的局部变量(它被定义为local,因为您在函数中指定它),这显然是您期望swap()
使用的变量。但是在你的swap
函数中,你使用变量x
,它既不是函数的参数也不是在函数内赋值(两者都会使它成为局部变量),所以它被解析为上面声明的全局x
。
IOW,swap
使用全球x
为什么你期望它使用SortArray()
本地的那个。这也是第二个版本工作的原因,因为这次它使用了适当的变量。
解决方案是删除全局qazxsw poi并明确地将正确的值传递给qazxsw poi,即:
x
当你在它的时候,你也应该和swap()
一样 - 实际上,你应该尽可能地避免使用全局变量(并且相信我,你可以在不使用全局变量的情况下编写很多代码):
def swap(x):
temp = score[x + 1]
score[x + 1] = score[x]
score[x] = temp
def SortArray():
y = 0
while y < COMPS:
x = 0
while x < COMPS:
if score[x] > score[x + 1]:
swap(x)
x += 1
y += 1
现在,您的函数可以与任何列表或序列一起使用。它们仍然是完全untythonic但这显然不是重点(python有一个内置的最优化的排序算法)。