Глубокое копирование Python с целыми числами против массивов

#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 Я прочитал вашу статью. Хорошо объяснено.