Изменчивый и неизменный объект в Python - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь понять изменчивый / неизменный объект в python. В приведенном ниже примере я ожидаю получить одинаковые идентификаторы объектов для всех идентификаторов (**), но # list 4 - нет. Как я могу объяснить причину, по которой только #list 4 дает другой идентификатор объекта? Спасибо.

# list 1
la = [1,2,3]
print('la=', la, ', id(la)= ',id(la))

# list 2
la[0]=9
print('la=', la, ', id(la)= ',id(la))

# list 3
lb=la
print('lb=', lb, ', id(lb)= ',id(lb))

# list 4
lc=la[:]
print('lc=', lc, ', id(lc)= ',id(lc))
la= [1, 2, 3] , id(la)=  2678849549576
la= [9, 2, 3] , id(la)=  2678849549576
lb= [9, 2, 3] , id(lb)=  2678849549576
lc= [9, 2, 3] , id(lc)=  2678844118664

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Синтаксис [:] является ярлыком для copy, который создает новый объект (мелкую копию) из исходного объекта. Мелкая копия - это новый высокоуровневый объект, поэтому на вложенные объекты будут ссылаться только (новые копии вложенных объектов не создаются). Пример,

a = [1,2,3]
b = a
id(a) == id(b) # True
c = a[:]
id(a) == id(c) # False
id(a[0]) == id(c[0]) # True
0 голосов
/ 10 февраля 2020

Подумайте об этом так: срез должен быть другим объектом, копией оригинала:

In [15]: la=[1,2,3]                                                                                                   

In [16]: la[:2]                                                                                                       
Out[16]: [1, 2]

In [17]: la=[1,2,3]                                                                                                   

In [18]: lb=la[:2]                                                                                                    

In [19]: lb[0] = 5                                                                                                    

In [20]: lb                                                                                                           
Out[20]: [5, 2]

In [21]: la                                                                                                           
Out[21]: [1, 2, 3]

la[:] - это срез, хотя в этой форме это срез, который возвращает весь список.

Однако срез работает так же, как и с кортежем, который является неизменяемым типом:

In [22]: ta=(1,2,3)                                                                                                   

In [23]: ta[:2]                                                                                                       
Out[23]: (1, 2)

et c.

Отличие от список, что вы не можете сделать ta[0] = 5. Это делает кортеж неизменным, а список изменяемым.

Присваивание la или ta не приводит к изменению какого-либо объекта, это только имена (псевдонимы) объектов:

ta=[1,2,3]
ta=4

Второе назначение не изменило список, оно изменило имя ta для ссылки на целое число 4. Список [1,2,3], если на него нет других ссылок, будет собирать и уничтожать мусор.


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