Оскільки люди в коментарях тут і в двох інших запитаннях, позначених дуппами, схожі на це так само плутаються, я думаю, варто додати додаткову відповідь на додаток до Алекса Ковентрі .
Той факт, що Алекс присвоює значення мутаційного типу, як-от переліку, не має нічого спільного з тим, поділяються чи ні. Це ми бачимо за допомогою 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
цього, щоб уникнути двох інших проблем, які я не хочу тут вникати; з двох різних причин цілком окремо створені 5
s можуть стати кінцевим той самий екземпляр числа 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
.
** Деякі люди користуються цим, використовуючи атрибут класу як "значення за замовчуванням" для атрибута екземпляра, який екземпляри можуть встановлювати або не встановлювати. Це може бути корисно в деяких випадках, але це також може бути бентежно, тому будьте обережні.