Список постоянно меняется, даже если он не вызывается - PullRequest
0 голосов
/ 17 апреля 2020

Список «stop» должен содержать координаты x и y, заданные функцией, когда длина строки «stringa» равна первому значению x, заданному списку (в данном случае 1023). Список (ы) не должны изменяться более одного раза, это сделано благодаря списку bool_stop, который отслеживает изменения, внесенные в список (ы), таким образом, до того, как значения х и у в списке будут ещё раз (в while l oop внутри функции "failapiega") if Statemet проверит, был ли список изменен, и заблокирует действие, если так. Вот почему я не понимаю, почему список постоянно меняет значения. Я полагаю, что что-то не так, пока l oop в функции, но я не могу определить, что.

x = 1
iterations = 10
stringa = "AB"
tot = 2 ** (iterations + 2)
In = tot / 4
stop = [[1, -1], [In - 1, None], [2 * In - 1, None], [3 * In - 1, None], [tot - 1, None]]
# stop[1] --> [1023.0, None] #
bool_stop = [True] * 4


def failapiega(stringa, stop, bool_stop):
    l = len(stringa)
    i = l - 1
    while i >= 0:
        p = stringa[i]
        if p == "A":
            stringa += "B"
            stop[0][0] += 1
        elif p == "B":
            stringa += "C"
            stop[0][1] += 1
        elif p == "C":
            stringa += "D"
            stop[0][0] -= 1
        elif p == "D":
            stringa += "A"
            stop[0][1] -= 1
        if bool_stop[0]:
            if stop[1][0] == len(stringa) - 1:
                bool_stop[0] = False
                stop[1] = stop[0]
        i -= 1
    return stringa, stop, bool_stop


while 0 <= iterations:
    stringa, stop, bool_stop = failapiega(stringa, stop, bool_stop)
    iterations -= 1

Отладка Я обнаружил, что

 if stop[1][0] == len(stringa) - 1:
                bool_stop[0] = False
                stop[1] = stop[0]

эта часть выполняется только один раз, несмотря на эту остановку [1] постоянно меняется каждый раз.

1 Ответ

0 голосов
/ 17 апреля 2020

После выполнения stop[1] = stop[0] остановите [0] и остановите [1] для одного и того же объекта. Если вы измените значения в одном, другой изменится.

Вместо этого вы можете сделать следующее, чтобы создать отдельный объект: stop[1] = list(stop[0])

Об этом следует помнить при работе со всем, что не Примитив https://en.wikiversity.org/wiki/Python_Concepts/Basic_data_types#Primitive_Variables

...