bugnikork
@bugnikork
Студент

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

Почему в результате выполнения данного кода меняются и первый, и второй списки, если я вносил изменения только во второй?

languages = ["Python", "Swift", "C++"]
new_list = languages
new_list.remove('Python')
print(new_list) # вывод: ['Swift', 'C++']
print(languages) # вывод: ['Swift', 'C++']
  • Вопрос задан
  • 116 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Читаем про изменяемые и неизменяемые объекты в питоне.
Если коротко, когда ты делаешь a = b, ты не копируешь объект. Ты просто создаёшь новую ссылку на него.
Достаточно проверить так:
print(languages is new_list) # True
Если объект изменяемый, то изменения будут видны по любой ссылке, что логично:
a = [1, 2, 3]
b = a  # b ссылается на тот же список
b.append(4)  # список изменили

Если объект неизменяемый, то это не так заметно, потому что ссылка заменяется на ссылку на новый объект:
a = 5
b = a  # b ссылается на 5
a += 1  # a = a + 1 т.е. a = 6 - a теперь ссылается на новый объект 6, b - по прежнему на 5.


Если нужна независимая копия списка, словаря или иного изменяемого объекта - делай её явно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
40usov
@40usov
Python TechLead
Чтобы правильно скопировать список: new_list = languages[:]
А происходит так потому, что languages и new_list ссылаются на один и тот же адрес в памяти. Поэтому меняя один, меняется и другой.

https://pythonist.ru/chem-mutabelnye-obekty-otlich...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы