【问题标题】:Why this Fuction cannot be called为什么无法调用此函数
【发布时间】:2019-08-03 03:17:50
【问题描述】:

我有这个列表,我想根据冒泡排序进行排序,代码中有一个函数 (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() 下的代码并替换它SortArray() 下方,if 条件 下方;就像这样:

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 中的交换可以在没有显式临时变量的单行中完成(不计算隐式创建的元组):score[x], score[x + 1] = score[x + 1], score[x]
  • 不建议以这种方式使用全局变量。
  • 好的,但这是否意味着swap()不能使用,我想如果我想调用它,它应该可以工作。
  • @SamJereriaManuel 看我的回答。

标签: python-3.x function bubble-sort


【解决方案1】:

我想知道为什么 swap() 函数没有在 SortArray()

下被调用

实际上,它被调用了——你可以自己检查,在其中添加几个 print() 调用或 using the step debugger——但它并没有做你认为应该做的事情,因为你混淆了局部变量和全局变量.

SortArray() 中,您定义了一个名为x本地 变量(它被定义为本地,因为您在函数中分配了它),这显然是您希望swap() 使用的变量.但是在您的swap 函数中,您使用了一个变量x,它既不是函数的参数,也不是在函数内分配的(两者都会使其成为局部变量),因此它被解析为 global x 在上面声明。

IOW,swap 使用全局 x 为什么您希望它使用 SortArray() 的本地变量。这也是第二个版本起作用的原因,因为这一次它使用了正确的变量。

解决方案是删除全局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

当你这样做的时候,你也应该和score一样——实际上,你应该尽可能地避免使用全局变量(相信我,你可以写很多很多不使用全局变量的代码):

def swap(score, x):
    temp = score[x + 1]
    score[x + 1] = score[x]
    score[x] = temp

def SortArray(score):
    comps = len(score) - 1
    y = 0
    while y < comps:
        x = 0 
        while x < comps:
            if score[x] > score[x + 1]:
                swap(score, x)
            x += 1
        y += 1


def displayArray(score):
    x = 0
    while x < len(score):
        print(score[x])
        x += 1

if __name__ == "__main__":
    score = [92,95,7,5,85,55,789,47,125,3265,88,965,655,3,15,448,0,255,455]
    SortArray(score)
    displayArray(score)

现在您的函数可以与任何列表或序列一起使用。它们仍然完全不符合 Python 标准,但这显然不是重点(无论如何,Python 内置了最优化的排序算法之一)。

【讨论】:

  • 工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2011-12-13
  • 1970-01-01
  • 2018-11-19
  • 2017-06-04
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多