非线性光学元件 2023-02-03 18:10 采纳率: 100%
浏览 27
已结题

Python两次调用函数改变了形参默认值

问题遇到的现象和发生背景

Python 两次调用同一个函数会改变形参的默认值

遇到的现象和发生背景,请写出第一个错误信息

下面是一段简单的函数,我们将它调用两次:

def func(A=[]):
    A.append(1)
    print(id(A))
    return A

print(func())  # [1]
print(func())  # [1,1]

Output:

1449889792264
[1]
1449889792264
[1, 1]

第一次输出[1],第二次输出[1,1],id()函数反映两个A是同一个对象。不知道这是为什么,我把这个函数略作修改,List()改Set(),输出结果却正好相反:

def func(A=set()):
    A.add(1)
    print(id(A))
    return A

print(func())  # {1}
print(func())  # {1,1}

Output:

2032723709064
{1}
2032723709064
{1}

依旧是同一个对象id,但是两次调用却没有改变默认形参的值
有没有精通Python的伙伴能解释一下。

  • 写回答

2条回答 默认 最新

  • P2441M 2023-02-03 18:31
    关注

    你是不是不知道set的作用……,它就是用来去除重复值的呀,两次都加上1,重复了,只会剩下1个。
    set确实是可变对象,你这样改一下就知道了:

    def func(value, A=set()):
        A.add(value)
        return A
    
    print(func(1))  # {1}
    print(func(2))  # {1, 2}
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月12日
  • 已采纳回答 2月4日
  • 创建了问题 2月3日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装