Почему эту функцию нельзя назвать - PullRequest
0 голосов
/ 12 марта 2019

У меня есть этот список, который я хочу отсортировать на основе пузырьковой сортировки, и в коде есть функция (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 () , ниже , если условие ; просто так:

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

тогда это работает, поэтому я хочу знать, почему функция swap () не вызывается при SortArray ()

1 Ответ

0 голосов
/ 12 марта 2019

Я хочу знать, почему функция swap () не вызывается при SortArray ()

На самом деле, он вызывается - который вы можете проверить самостоятельно, добавив пару print() вызовов внутри или , используя пошаговый отладчик - но он не делает то, что, как вы думаете, должен делать, потому что вы путаешь локальные и глобальные переменные.

В 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 - на самом деле, вы должны избегать глобальных переменных настолько, насколько это возможно (и поверьте мне, вы можете написать lot кода без использования глобалов):

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 в любом случае встроен один из самых оптимизированных алгоритмов сортировки).

...