非线性光学元件 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日

悬赏问题

  • ¥15 yolov8边框坐标
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂