m0_50027286 2021-09-20 23:19 采纳率: 100%
浏览 31
已结题

不太懂这个问题,求解答!

img

  • 写回答

1条回答 默认 最新

  • 微笑的菜鸟 2021-09-21 00:08
    关注

    可以这样自己添加打印信息看看,这里把变量的物理地址打印出来会比较清晰
    概括就是参数如果是可变类型如题中的数组,当该参数在调用时没有被赋值,运行时变量指向默认参数会直接影响后面调用的默认值

    搭配代码注释和运行截图更好理解

    下面是代码加注释,希望帮助你理解了这个问题,我也是用尽了洪荒之力

    def func(x=[], y=[6,7]):
        print("x 的地址", id(x), end=";")
        print("y 的地址", id(y))
        x.append(8)
        y.append(8)
        return x+y
    a, b = [1,2], [3,4]
    print("a的地址", id(a), "b的地址", id(b))
    # x传了,调用方法时,方法内的变量 x 指向 a 变量,默认参数x 不受影响,调用完之后默认参数 x=[]
    # y没传,调用方法时,方法内的变量 y 指向默认参数y,  默认参数 y 执行了 append 操作,调用完之后 y=[6,7,8]
    print("调用时只把 a 赋值给 x", end=">>")
    t = func(x=a)
    # x没传,调用方法时,方法内的变量 x 默认参数x,默认参数 x 执行了 append 操作,调用完之后默认参数 x=[8]
    # y传了,调用方法时,方法内的变量 y 指向 b 变量,  默认参数 y 不受影响,调用完之后还是上一轮的值 y=[6,7,8]
    print("调用时只把 b 赋值给 y", end=">>")
    t = func(y=b)
    # x没传,调用方法时,方法内的变量 x 默认参数x,默认参数 x 执行了 append 操作,调用完之后默认参数 x=[8,8]
    # y没传,调用方法时,方法内的变量 y 指向默认参数y,  默认参数 y 执行了 append 操作,调用完之后 y=[6,7,8,8]
    # 所以拼接起来就是最终结果x+y=[8, 8, 6, 7, 8, 8]
    print("调用时不传参")
    print(func(), end=';')
    print()
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 9月29日
  • 已采纳回答 9月21日
  • 创建了问题 9月20日

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集