Python 是什么导致在处理传递给函数的列表参数和字典参数时出现不同的行为?

Python 是什么导致在处理传递给函数的列表参数和字典参数时出现不同的行为?,python,python-3.x,function,methods,Python,Python 3.x,Function,Methods,当尝试使用函数调用来修改调用函数中变量的值时,我在传递列表和设置为函数参数时观察到以下行为差异 #将列表作为参数传递 (一): a=a.append(13) a=[12] 印刷品(a) 乐趣(a) 印刷品(a) #输出 [12] [12, 13] #将集合作为参数传递 (一): a=a.union({13}) a={12} 印刷品(a) 乐趣(a) 印刷品(a) #输出 {12} {12} 我的问题是,为什么在使用列表时,函数的更改会转移到调用函数,而在使用set时,即使它们都是可变数据类型

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

#将列表作为参数传递
(一):
a=a.append(13)
a=[12]
印刷品(a)
乐趣(a)
印刷品(a)
#输出
[12]
[12, 13]
#将集合作为参数传递
(一):
a=a.union({13})
a={12}
印刷品(a)
乐趣(a)
印刷品(a)
#输出
{12}
{12}

我的问题是,为什么在使用列表时,函数的更改会转移到调用函数,而在使用set时,即使它们都是可变数据类型,也不会转移到调用函数?

您正在比较的操作并不等价

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

如果您执行了
aset.add(13)
,则该集合相当于
alist.append(13)
(向现有集合添加新元素)。

如果您执行了
alist=alist+[13]
,则该列表相当于
aset=aset.union({13})
(创建包含额外元素的新集合)。

a.append
更改列表
a
a.union
创建一个新集合,但不修改原始集合。它们不是等价的。仅仅因为一个类型是可变的,并不意味着该类型的每个方法都会改变它的值。