24k纯新 2022-12-03 12:08 采纳率: 0%
浏览 19

python 二级 函数

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

做Python中的一道选择题,想不明白,大神们给看看,给我解个惑

用代码块功能插入代码,请勿粘贴截图

def func(x = [],y = [6,7]):
x.append(8)
y.append(8)
return(x + y)
a,b = [1,2],[3,4]
t = func(x = a)
t = func(y = b)
print(func(),end = ';')

运行结果及报错内容

运行结果:[8, 8, 6, 7, 8, 8];
我的结果(想的)[8, 8, 6, 7, 8];

我的解答思路和尝试过的方法

用Pycharm debug 也没看明白

我想要达到的结果

最后那个print(func(),end = ';') 执行后 函数里的y 为什么等于[6,7,8]?

  • 写回答

2条回答 默认 最新

  • JarodYv 人工智能领域优质创作者 2022-12-03 13:26
    关注

    这是Python中很常见的一个坑,这里涉及的一个知识点是Python函数参数的默认值是静态的。换句话说当python解析到def func(x = [],y = [6,7]):这句时就会在静态数据区创建默认值[]和[6, 7]。

    当你调用t = func(x = a)时,y没有传参因此会使用默认值,因此执行后静态区的默认值变为[], [6,7,8]

    当你调用t = func(y = b)时,x没有传参因此会使用默认值,因此执行后静态区的默认值变为[8], [6,7,8]

    最后当调用func()时,x,y都没有传参因此都会使用默认值,此时默认值为[8], [6,7,8],所以最后的结果是[8, 8] + [6, 7, 8, 8],最终为[8, 8, 6, 7, 8, 8]

    因此函数默认参数尽量不要用可变集合类型,用可变集合类型做参数会有很多潜在的问题,我都整理在这篇文章里,你可以参考一下:

    Python避坑指南

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 12月3日
  • 创建了问题 12月3日

悬赏问题

  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振