在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑.

入坑

挖坑

def f(x,li=[]):for i in range(x):li.append(i*i)print(li)print('---1---')
f(4)
print('---2---')
f(5)

预期结果

---1---
[0, 1, 4, 9]
---2---
[0, 1, 4, 9, 16]

执行结果

---1---
[0, 1, 4, 9]
---2---
[0, 1, 4, 9, 0, 1, 4, 9, 16]

出坑

当定义函数时,会保存函数中默认参数 list 的值,也就是列表 li=[];

在每次调用的时候如果传递了新的列表,则使用传递的列表,没有传递,使用定义函数时保存的默认参数(li=[]);

上面两次调用中,都没有传递新的列表(使用默认列表 li=[] ),程序会调用定义函数时保存的默认参数((li=[]));

列表在append的时候会在 li=[] 原来的基础上append追加值,所以会产生以上结果.

通过打印列表的ID进行辨识

打印列表 li=[] 的ID:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def f(x,li=[]):print(id(li))  # 添加打印idfor i in range(x):li.append(i*i)print(li)print('---1---')
f(4)
print('---2---')
f(5)

结果:

---1---
140306123906248
[0, 1, 4, 9]
---2---
140306123906248
[0, 1, 4, 9, 0, 1, 4, 9, 16]

会发现ID值是相同的;

说明两次执行时使用的都是定义函数时的默认参数 li=[ ]

执行时往里面传新的列表

打印列表 li=[] 的ID 和 传的新列表的ID:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def f(x,li=[]):print(id(li))for i in range(x):li.append(i*i)print(li)print('---1---')
f(4)
print('---2---')
f(5,[])
print('---3---')
f(6)

结果:

---1---
[0, 1, 4, 9]
---2---
[0, 1, 4, 9, 16]
---3---
[0, 1, 4, 9, 0, 1, 4, 9, 16, 25]

会发现执行传递空(新)列表的函数时打印的ID不一样,而没有传递的一样;

当传递空列表时,函数体当中会使用传递的空列表,没有传递时,使用函数默认值 li=[ ], 所以会产生以上结果.

优化

如果想要达到预期的结果,只需要在函数体里进行判断即可:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def f(x, li=[]):if not li:# 如果li不为空的话,就往下走(清空列表); 为空就不走li = []for i in range(x):li.append(i * i)print(li)print('---1---')
f(4)
print('---2---')
f(5)
print('---3---')
f(6)

结果:

---1---
[0, 1, 4, 9]
---2---
[0, 1, 4, 9, 16]
---3---
[0, 1, 4, 9, 16, 25]

python函数中把列表(list)当参数时的入坑与出坑相关推荐

  1. python函数参数为列表_python函数中把列表(list)当参数时的入坑与出坑

    在Python函数中,传递的参数如果默认有一个为 列表(list),那么就要注意了,此处有坑. 入坑 挖坑 def f(x,li=[]): for i in range(x): li.append(i ...

  2. [转载] Python函数中把列表(list)当参数

    参考链接: Python中的id函数 当定义函数时,会保存函数中默认参数 list 的值,也就是列表 l=[]: 在每次调用的时候如果传递了新的列表,则使用传递的列表,没有传递,使用定义函数时保存的默 ...

  3. 站长在线Python精讲:在Python函数中理解形式参数和实际参数

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中理解形式参数和实际参数>.本文的主要内容有:Python中形式参数的概念和特点,Python中实际参数的 ...

  4. Python之在函数中使用列表作为默认参数

      本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数.   我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使 ...

  5. python默认参数举例_Python之在函数中使用列表作为默认参数

    本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数. 我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使用列表作 ...

  6. 站长在线Python精讲:在Python函数中参数传递的位置参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中参数传递的位置参数详解>.本文的主要内容有:实参和形参数量必须与定义时一致和实参和形参位置必须与定义时一 ...

  7. python 函数中参数的传递方式(三分钟读懂)

    python 函数中参数的传递方式 第一种:指定默认值 def fn1(a = 1): # 函数中的(a)是形参 和外面的变量无关 (这里的是定义函数中指定默认值)print("fn1&qu ...

  8. [转载] 详细介绍Python函数中的默认参数

    参考链接: Python函数中的默认参数 详细介绍Python函数中的默认参数 import datetime as dt def log_time(message, time=None): if t ...

  9. python函数设置默认参数_深入讲解Python函数中参数的使用及默认参数的陷阱

    这篇文章主要介绍了Python函数中参数的使用及默认参数的陷阱,文中将函数的参数分为必选参数.默认参数.可变参数和关键字参数来讲,要的朋友可以参考下 C++里函数可以设置缺省参数,Java不可以,只能 ...

最新文章

  1. jupyter配置默认启动目录
  2. [WPF] VisualBrush 中的布局
  3. opencv图像处理常用函数
  4. python【蓝桥杯vip练习题库】ALGO-66字符串编辑
  5. JavaScript中的面向对象
  6. OO实现ALV TABLE 十一:ALV的聚合,排序,过滤
  7. UNITY优化资料收集
  8. 14 | 深入解析Pod对象(一):基本概念
  9. TV Input Framework --Android官方说明
  10. 预测大盘最准确的指标_迄今最权威的大盘预测K线指标下载
  11. 传统企业如何做数字化转型?弄懂这3大底层逻辑你就懂了
  12. 差异表达基因热图怎么看_陈根:从基因层面看衰老本质,被误会的端粒差异
  13. 【Flutter实战】定位装饰权重组件及柱状图案例
  14. 【Linux进程】Linux进程
  15. pythonplt制作饼状图_4.5Python数据处理篇之Matplotlib系列(五)---plt.pie()饼状图
  16. 云计算进入深水区, MSP才是政企用好云的生力军
  17. 在类树莓派的ARM开发板上组建大数据集群
  18. Nginx跨域配置、防盗链配置
  19. “咖哥”变身数据侦探,手撕商业分析实战
  20. codevs 2924 数独挑战 x(三种做法+超详细注释~)

热门文章

  1. 本地yum仓库和http方式的yum仓库。
  2. led显字风扇原理?
  3. 中国馆智能视频监控系统
  4. LFS 安装笔记 (二)
  5. phrases practice_七年级短语、固定搭配练习题Phrases practice for Grade seven
  6. c语言NULL和0区别
  7. 如何蒸螃蟹?教你蒸螃蟹3个小窍门
  8. SAP中事务代码ME2N中引出的表格里,仍要Invoice数量是什么含义?
  9. SAP创建Web Service以及用ABAP调用
  10. 采购组织0001不对工厂1000负责