#python #arrays #list #integer #deep-copy
#python #массивы #Список #целое число #глубокое копирование
Вопрос:
Учитывая следующий код:
x = y = z = 0
x = 10
print(y) // prints 0
x = y = z = [1, 2, 3, 4, 5]
x[0] = 10
print(y) // prints [10, 2, 3, 4, 5]
Почему с простыми целыми числами Python не выполняет глубокое копирование, в то время как с массивами это происходит?
Комментарии:
1. Ничего не копируется ни в том, ни в другом. Целые числа неизменяемы .
2. Кроме того, если поведение списка является тем, которое вы ошибочно приняли за глубокое копирование, то у вас полностью обратная концепция «глубокого копирования».
3.
x[0] = 10
это сокращение от мутирующего вызова методаx.__setitem__(0, 10)
; это значительно отличается от прямого присвоения имени.4. Обязательное чтение: nedbatchelder.com/text/names.html
5. Предполагая, что вы новичок в языках в целом, может быть проще просто знать, что это поведение Python. Если вы действительно хотите понять, почему такое поведение таково, я рекомендую использовать язык более низкого уровня или подключить Python к отладчику, который показывает значения памяти.
Ответ №1:
В первом примере у вас есть три указателя, указывающие на ячейку памяти для целого числа. Затем вы направляете один из указателей, X, в другую ячейку памяти. Два других указателя продолжают указывать на исходное целое число. Во втором примере у вас есть три указателя, указывающие на список. Список является изменяемым. Затем вы меняете один из элементов в списке. Три указателя по-прежнему указывают на один и тот же список, и проверка значения любого из них вернет тот же ответ.
Комментарии:
1. Строго говоря, у вас есть три имени , привязанные к одному и тому же объекту. Модель данных Python не включает понятие памяти: это деталь реализации.
2. @chepner Я прочитал вашу статью. Хорошо объяснено.