Оскільки люди в коментарях тут і в двох інших запитаннях, позначених дуппами, схожі на це так само плутаються, я думаю, варто додати додаткову відповідь на додаток до Алекса Ковентрі .
Той факт, що Алекс присвоює значення мутаційного типу, як-от переліку, не має нічого спільного з тим, поділяються чи ні. Це ми бачимо за допомогою idфункції або isоператора:
>>> class A: foo = object()
>>> a, b = A(), A()
>>> a.foo is b.foo
True
>>> class A:
... def __init__(self): self.foo = object()
>>> a, b = A(), A()
>>> a.foo is b.foo
False
(Якщо вам цікаво, чому я використовував object()замість, скажімо, 5цього, щоб уникнути двох інших проблем, які я не хочу тут вникати; з двох різних причин цілком окремо створені 5s можуть стати кінцевим той самий екземпляр числа 5. Але повністю окремо створений object()s не може.)
Отже, чому це a.foo.append(5)в прикладі Алекса впливає b.foo, але a.foo = 5в моєму прикладі не так? Ну, спробуйте a.foo = 5в прикладі Алекса, і зверніть увагу , що це не впливає b.fooтам або .
a.foo = 5просто перетворюється a.fooна ім'я для 5. Це не впливає на b.fooбудь-яке інше ім'я для старого значення, на яке a.fooраніше посилалися. * Трохи складно, що ми створюємо атрибут екземпляра, який приховує атрибут класу **, але як тільки ви це отримаєте, нічого складного немає відбувається тут.
Сподіваємось, тепер очевидно, чому Алекс використав список: той факт, що ви можете мутувати список, означає, що простіше показати, що дві змінні називають один і той же список, а також означає, що в коді реального життя важливіше знати, чи є у вас два списки чи два імені для одного списку.
* Плутанина для людей, що походять з такої мови, як C ++, полягає в тому, що в Python значення не зберігаються у змінних. Значення відпадають у value-land, самі по собі змінні є лише іменами значень, а присвоєння просто створює нове ім'я для значення. Якщо це допомагає, подумайте про кожну змінну Python як shared_ptr<T>а T.
** Деякі люди користуються цим, використовуючи атрибут класу як "значення за замовчуванням" для атрибута екземпляра, який екземпляри можуть встановлювати або не встановлювати. Це може бути корисно в деяких випадках, але це також може бути бентежно, тому будьте обережні.