Почему эта странная вещь происходит в моем списке? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть список, и я хочу перевернуть в моем списке и изменить каждый элемент с предыдущим элементом до первого элемента:

lst = [[1,2], [1,3], [1,4], [2,4]]
for i in range(len(lst) - 1, 0, -1):
    lst[i] = lst[i-1]

lst[0][0] += 1

После этого я ожидаю следующий результат:

>>> lst
[[2, 2], [1, 2], [1, 3], [1, 4]]

Но результат таков:

>>> lst
[[2, 2], [2, 2], [1, 3], [1, 4]]

Я слышал что-то о ссылках между двумя списками, когда вы назначаете их друг другу, но вопрос в том, почему этот результат не произойдет для других элементы, например:

lst = [[1,2], [1,3], [1,4], [2,4]]
for i in range(len(lst) - 1, 0, -1):
    lst[i] = lst[i-1]

lst[2][0] += 1

Это результат:

>>> lst
[[1, 2], [1, 2], [2, 3], [1, 4]]

Что я ожидаю:

>>> lst
[[1, 2], [1, 2], [2, 3], [2, 4]]

Почему между * 1019 нет ссылок * и lst[3]?

1 Ответ

1 голос
/ 12 апреля 2020

Давайте дадим вашим подспискам индивидуальные имена, поэтому ваш список изначально

lst = [a, b, c, d]

Теперь вы выполняете это l oop:

for i in range(len(lst) - 1, 0, -1):
    lst[i] = lst[i-1]

На каждом шаге это то, что вы получаете :

# lst[3] = lst[2]
[a, b, c, c]
# lst[2] = lst[1]
[a, b, b, c]
# lst[1] = lst[0]
[a, a, b, c]

Теперь вы получите lst[0] и lst[1] как один и тот же объект, поэтому, когда вы вносите изменения в lst[0], вы видите то же самое изменение в lst[1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...