Неожиданное поведение Alias - PullRequest
0 голосов
/ 10 июня 2018

Может кто-нибудь объяснить мне, почему следующий код выводит то, что я делаю?

firstlist = [1,2,3,4,5,6,7,7]
alias = firstlist
firstlist = firstlist*2
print(firstlist)
print(alias)

вывод:

[1, 2, 3, 4, 5, 6, 7, 7, 1, 2, 3, 4, 5, 6, 7, 7]

[1, 2, 3, 4, 5, 6, 7, 7]

Как получается, когда первый списокумножается на два и обновляется, изменения не отражаются в «псевдониме».У меня сложилось впечатление, что поскольку «псевдоним» и «первый список» указывают на одни и те же значения, любое изменение, внесенное в «первый список», должно отражаться и «псевдонимом».

1 Ответ

0 голосов
/ 10 июня 2018

В этой строке происходит две вещи:

firstlist = firstlist*2

Вы умножаете firstlist на два, а затем присваиваете переменную, которая просто происходит с firstlist - это немодификация на месте.Следовательно, firstlist и alias указывают на разные объекты.

Наоборот, если вы измените firstlist на месте, например, добавив его, вы увидите, что обе переменные по-прежнему указывают наодин и тот же объект и имеют одинаковое значение:

>>> firstlist = [1,2,3,4,5,6,7,7]
>>> alias = firstlist
>>> firstlist.extend(firstlist)
>>> print(firstlist)
[1, 2, 3, 4, 5, 6, 7, 7, 1, 2, 3, 4, 5, 6, 7, 7]
>>> print(alias)
[1, 2, 3, 4, 5, 6, 7, 7, 1, 2, 3, 4, 5, 6, 7, 7]
...