a
и b
сделать не ссылка c
, все три из них ссылаться на объект 10
.
Это означает, что выполнение c = 123
не изменит объект заc
, он будет просто указать c
на новом объекте 123
, оставляя a
и b
в одиночку.
Другими словами, у вас есть изначально:
a ---+
|
b ---+---> 10-object
|
c ---+
и исполняющие c = 123
изменения, чтобы:
a ---+
|
b ---+---> 10-object
c -------> 123-object
Чем раньше вы поймете, что Python действительно является полностью объектно-ориентированным, тем быстрее вы 'lk grok язык :-)
Причина, по которой ваш второй образец изменяет все элементы в l
потому, что все элементы в l
списке ссылки на единый list1
, а не отдельные объекты аккомпанемента:
l -------> list2 {list1, list1, list1}
m -------> list1 {0-object}
Выполнение l[0][0] = 1
идентично выполнения m[0] = 1
(см ниже), который не изменит связывания из m
в свой список, или связывание этих элементов в list2
к list1
, а просто изменить пункт вlist2
быть 1-object
:
l -------> list2 {list1, list1, list1}
m -------> list1 {1-object}
Следовательно, вы можете видеть, что изменение содержания list1
влияет на все.Транскрипт показывает, что l[0][0]
и m[0]
эквивалентны показано ниже:
>>> m = [0]
>>> l = [m] * 3
>>> m
[0]
>>> l
[[0], [0], [0]]
>>> l[0][0] = 1
>>> l
[[1], [1], [1]]
>>> m
[1]
>>> m[0] = 42
>>> l
[[42], [42], [42]]
Обратите внимание, что если вы измените связывания из m
, что не изменит фактические привязок в list2
:
>>> m = [999]
>>> l
[[42], [42], [42]]
Когда вы это сделаете, вы получите:
l -------> list2 {list1, list1, list1}
list1 {42-object}
m -------> list3 {999-object}
Ваш ответ настолько хорош ... I только пожелайте, чтобы заголовок вопроса был более описательным, чтобы больше людей с большей вероятностью находило этот ответ. – SethMMorton
Большое вам спасибо. – Alcott