首页 > 解决方案 > 是什么导致处理传递给函数的列表参数和字典参数的不同行为?

问题描述

在尝试使用函数调用来修改调用函数中变量的值时,我观察到在传递列表和设置为函数参数时的以下行为差异。

#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 时却没有,即使它们都是可变数据类型?

标签: pythonpython-3.xfunctionmethods

解决方案


您正在比较的操作是不等价的。

alist.appendalist在(并返回None)处更改列表。
aset.union创建一个新集合但不修改原始集合。

如果你这样做aset.add(13)了,那将是alist.append(13)(将新元素添加到现有集合中)的集合。
如果你这样做alist = alist + [13]了,那么列表相当于aset = aset.union({13})(创建一个包含额外元素的新集合)。


推荐阅读