1

Тема: Збереження змінних зі списку - відмінності

Якщо маємо список(або кортеж) зі списків, і присвоюємо змінній його певне значення, то подальша зміна цієї змінної впливає на сам первісний список. Якщо маємо список із str або num, і присвоюємо змінній його певне значення, то подальша зміна цієї змінної НЕ впливає на сам первісний список. Чи можна підказати у чому причина такої дивної відмінності?
Для ясності наводжу короткий приклад:


sample_list1 = ['Python', 'Swift', 'Java', 1, 2, 3] 
sample_list2 = [['Python', 'Swift', 'Java'], [1, 2, 3]]

x1_str = sample_list1[1]
x1_num = sample_list1[4]

x2_str = sample_list2[0]
x2_num = sample_list2[1]

print(x1_str, x1_num, x2_str[1], x2_num[1])

#assign another value
x1_str = 'PHP'
x1_num = 10

x2_str[1] = 'PHP'
x2_num[1] = 10


print(x1_str, x1_num, x2_str[1], x2_num[1])

print(' List1', sample_list1, '\n', 'List2', sample_list2)

2 Востаннє редагувалося koala (13.10.2023 19:26:11)

Re: Збереження змінних зі списку - відмінності

Це зветься "мутабельністю". Рядки, числа і тьюпли немутабельні (immutable), коли є об'єкт цього типу, то він уже не зміниться, можна лише створити інший об'єкт цього типу.

a = 2
b = a      # a і b посилаються на один об'єкт
b += 2     # створюється новий об'єкт і призначається b
print(a,b) # 2 4
a = [2]
b = a      # a і b посилаються на один об'єкт
b += [2]   # a теж змінилося
print(a,b) # [2,2] [2,2]

Але слід враховувати, що тьюпли, хоч самі немутабельні, можуть містити мутабельні елементи.
Немутабельні об'єкти можна хешувати, тому вони можуть бути елементами множин (set і frozenset) і ключами map.
Тожсамість об'єктів перевіряє оператор is. У наведених прикладах a is b буде True. Але, наприклад,

a = [2]
b = a
b += [2]
c = [2,2]
print(a == b, a is b, a == c, a is c) # True True True False

Останній False позначає, що хоча списки a і c рівні, але це різні об'єкти і зміна одного не зачепить інший.

Подякували: leofun01, caption_l2