.append () добавление 2 значений и удаление 1 предыдущего значения - PullRequest
0 голосов
/ 16 марта 2020

Привет. Я пытался выяснить, почему в этом коде permutations.append (lst) не только добавляется дважды, но и удаляет первый термин в «permutations».

def permute(lst):
    permutations = []
    permutations.append(lst)
    flag = True
    while flag:
        k = len(lst) - 2
        while k>=0:
            if lst[k] < lst[k+1]:
                break
            k -= 1
        else:
            flag = False
            break
        l = len(lst) - 1
        while l>k:
            if lst[k] < lst[l]:
                break
            l-=1
        lst[k], lst[l] = lst[l], lst[k]
        lst = lst[:k+1] + lst[len(lst)-1: k :-1]
        print('a')
        permutations.append(lst)
        print(lst, 'b')
    return permutations
print(permute([2,3,4,5])

Я разместил команды печати, чтобы проверить, работает ли блок по какой-то причине дважды, но это не так. Вместо того, чтобы заключительные перестановки были вложенными списками всех перестановок в [2,3,4,5] по порядку, это дает:

[[2, 3, 5, 4], [2, 4, 5, 3], [2, 4, 5, 3], [2, 5, 4, 3], [2, 5, 4, 3], [3, 5, 4, 2], [3, 2, 5, 4], [3, 4, 5, 2], [3, 4, 5, 2], [3, 5, 4, 2], [3, 5, 4, 2], [4, 5, 3, 2], [4, 2, 5, 3], [4, 3, 5, 2], [4, 3, 5, 2], [4, 5, 3, 2], [4, 5, 3, 2], [5, 4, 3, 2], [5, 2, 4, 3], [5, 3, 4, 2], [5, 3, 4, 2], [5, 4, 3, 2], [5, 4, 3, 2], [5, 4, 3, 2]] 

1 Ответ

2 голосов
/ 16 марта 2020

Это потому, что когда вы добавляете lst к permutations, вы фактически добавляете ссылку на объект, а не только значения объекта. Таким образом, когда вы затем изменяете значения lst позже, permutations также изменяется.

list.copy() возвращает только значения списка, отделенного от исходного объекта. Таким образом, если вы замените свои permutations.append(lst) строки на permutations.append(lst.copy()), вы должны получить желаемый результат.

Демонстрация эффекта ссылки на список против скопированного списка:

>>> x = [1]
>>> y = []
>>> y.append(x)  # Directly append x to y
>>> y
[[1]]
>>> x[0] = 2
>>> y  # Changing x changed y
[[2]]
>>> y = []
>>> y.append(x.copy())  # Append copy of x to y
>>> y
[[2]]
>>> x[0] = 3
>>> y  # Changing x had no effect on y
[[2]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...