为什么无法调用此函数

问题描述 投票:-1回答:1

我有这个列表,我想根据冒泡排序排序,并且代码中有一个函数(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()函数

python-3.x function bubble-sort
1个回答
0
投票

我想知道为什么在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有一个内置的最优化的排序算法)。

© www.soinside.com 2019 - 2024. All rights reserved.