python - 是什么导致处理传递给函数的列表参数和字典参数的不同行为?
问题描述
在尝试使用函数调用来修改调用函数中变量的值时,我观察到在传递列表和设置为函数参数时的以下行为差异。
#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 时却没有,即使它们都是可变数据类型?
解决方案
您正在比较的操作是不等价的。
alist.append
alist
在(并返回None
)处更改列表。
aset.union
创建一个新集合但不修改原始集合。
如果你这样做aset.add(13)
了,那将是alist.append(13)
(将新元素添加到现有集合中)的集合。
如果你这样做alist = alist + [13]
了,那么列表相当于aset = aset.union({13})
(创建一个包含额外元素的新集合)。
推荐阅读
- google-chrome-extension - 发现您的项目请求/获取了一个或多个外部脚本
- html - 使这个 SVG 全宽
- docker - 尝试运行 docker 容器,出现错误“api_db_1 exited with code 255”
- c# - Equals 方法的奇怪行为
- java - onAdImpression() 未在 Admob 侦听器中调用
- javascript - JSON to javascript 编辑 JSON 的值
- java - Java - set 如何在 Servlet 中抛出异常?
- apache-zookeeper - 无法外部连接zookeeper节点
- sql - 尝试执行更新过程但出现错误 - PL/SQL: ORA-00933:
- c# - 在 asp.net/c# 中将电子邮件服务器连接到我的 Web 应用程序的联系人页面#