Чем обусловлено различное поведение параметров списка обработки и параметров словаря, передаваемых в функцию? - PullRequest
0 голосов
/ 03 июля 2019

Пытаясь использовать вызов функции для изменения значения переменной в вызывающей функции, я наблюдал следующую разницу в поведении при передаче списка и в качестве параметров функции.

#Passing list as parameter
def fun(a):
    a = a.append(13)

a = [12]
print(a)
fun(a)
print(a)

#Output
[12]
[12, 13]
#Passing set as a parameter
def fun(a):
    a = a.union({13})

a = {12}
print(a)
fun(a)
print(a)

#Output
{12}
{12}

Мой вопрос: почему изменения из функции переносятся в вызывающую функцию при использовании списка, но не при использовании set, даже если они оба являются изменяемыми типами данных?

1 Ответ

3 голосов
/ 03 июля 2019

Операции, которые вы сравниваете, не эквивалентны.

alist.append изменяет список на alist (и возвращает None).
aset.union создает новый набор, но неизмените оригинал.

Если вы сделали aset.add(13), это было бы набором эквивалента alist.append(13) (добавление нового элемента в существующую коллекцию).
Если вы сделали alist = alist + [13], это было бысписок, эквивалентный aset = aset.union({13}) (создание новой коллекции, содержащей дополнительные элементы).

...