Назначение данных и проблема области в Python - PullRequest
0 голосов
/ 01 марта 2020

Я столкнулся с очень неприятной проблемой в Python. Я пытаюсь создать алгоритм сортировки, который работает следующим образом:

  1. Я читаю одну переменную из списка
  2. Я проверяю, сколько переменных имеет меньшее значение, чем эта переменная, и присваиваю в переменную места
  3. текущая переменная ставится на ее место
  4. перейти к следующей переменной и повторить

Проблема в том, что фиктивная переменная автоматически сбрасывается в ноль после увеличения. Я не могу выполнить пошаговое выполнение программы, поэтому очень сложно выяснить, в чем дело.

У меня очень мало опыта работы с python, поэтому любая помощь очень ценится.

# sorting algorithm
theList = [9, 7, 8, 5, 6, 3, 4, 1, 2, -1]
def order(n):
    a = 0
    m = n
    print(n)
    print(m)
    while a < len(n):
        b = 0
        c = 0 #this is where the problem is
        while b < len(n):
            if n[b] < n[a]:
                c += 1 # after this if statement isn't true, c reverts to zero
            print(c)
            b += 1
        #I think I should be able to put m[c] = n[a], but this doesn't work
        a += 1
    print(n)
    print(m)
order(theList)

1 Ответ

1 голос
/ 01 марта 2020
m = n

Не создает новый список. Он просто отображает имя m в тот же список, на который указывает n. Поэтому, когда вы делаете m[c] = n[a], первоначальный список также изменяется - отсюда и неожиданное поведение.

Попробуйте:

def order(n):
    a = 0
    m = n[:] # create copy
    print(n)
    print(m)
    while a < len(n):
        b = 0
        c = 0
        while b < len(n):
            if n[b] < n[a]:
                c += 1
            print(c)
            b += 1
        m[c] = n[a] # assign in output
        a += 1
    print(n)
    print(m)

Это создает копию и, похоже, решает проблему:

...
[9, 7, 8, 5, 6, 3, 4, 1, 2, -1]
[-1, 1, 2, 3, 4, 5, 6, 7, 8, 9]

PS: для сортировки не требуется копия списка в быть сделано. Есть лучшие алгоритмы, которые могут изменить список на месте.

...