Якщо ви їдете на Python з мови на C / Java / тощо. родина, це може допомогти вам перестати думати про a"змінну" і почати мислити про це як "ім'я".
a,, bі cне є різними змінними з рівними значеннями; вони різні імена для однакового значення. Змінні мають типи, ідентичності, адреси та всі подібні речі.
У імен нічого такого немає. Значення , звичайно, є, і ви можете мати безліч імен з однаковим значенням.
Якщо ви даєте Notorious B.I.G.хот-дог, * Biggie Smallsі Chris Wallaceхот-дог. Якщо ви зміните перший елемент aна 1, перші елементи bі cє 1.
Якщо ви хочете знати, чи два імена називають один і той же об’єкт, скористайтеся isоператором:
>>> a=b=c=[0,3,5]
>>> a is b
True
Ви запитаєте:
чим відрізняється від цього?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Тут ви відновите ім'я eдо значення 4. Це не впливає на імена dі fяким - небудь чином.
У попередній версії ви призначали a[0], а не a. Отже, з точки зору a[0], ви відновлюєте a[0], але з точки зору a, ви змінюєте його на місці.
Ви можете скористатися idфункцією, яка дає вам унікальне число, що представляє особу об'єкта, щоб побачити, який саме об'єкт є, який навіть коли isне може допомогти:
>>> a=b=c=[0,3,5]
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261120
>>> id(b[0])
4297261120
>>> a[0] = 1
>>> id(a)
4473392520
>>> id(b)
4473392520
>>> id(a[0])
4297261216
>>> id(b[0])
4297261216
Зверніть увагу, що a[0]змінилося з 4297261120 на 4297261216 - тепер це назва для іншого значення. А b[0]також тепер є ім'ям того самого нового значення. Це тому, що aі bдосі називають один і той же об’єкт.
Під обкладинками a[0]=1насправді викликається метод на об'єкті списку. (Це рівнозначно a.__setitem__(0, 1).) Отже, це насправді взагалі нічого не відбиває. Це як дзвонити my_object.set_something(1). Звичайно, ймовірно, що об'єкт відновлює атрибут примірника для реалізації цього методу, але це не важливо; що важливо, це те, що ви нічого не призначаєте, ви просто мутуєте об'єкт. І те саме з a[0]=1.
user570826 запитав:
Що робити, якщо ми маємо, a = b = c = 10
Це точно така ж ситуація, як і у a = b = c = [1, 2, 3]вас: три імені на одне значення.
Але в цьому випадку значення є an int, а ints незмінні. У будь-якому випадку ви можете повторно пов’язати aз іншим значенням (наприклад, a = "Now I'm a string!"), але значення не вплине на початкове значення, яке bі cдосі буде назви. Різниця полягає в тому, що зі списком, ви можете змінити значення [1, 2, 3]в [1, 2, 3, 4]практичній діяльності, наприклад, a.append(4); оскільки це насправді змінює значення, для якого bі cє імена, bтепер буде b [1, 2, 3, 4]. Немає можливості змінити значення 10на щось інше. 1010 років назавжди, як і Клавдії, вампіру 5 вічно (принаймні, поки її не замінить Кірстен Данст).
* Попередження: Не дайте Notorious BIG хот-дог. Гангста-реп-зомбі ніколи не слід годувати після півночі.
a,bіc,на все це вказує на те ж значення (в даному випадку список), або ви хочетеa=0,b=3іc=5. У такому випадку ви хочетеa,b,c = [0,3,5]або простоa,b,c = 0,3,5.