本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数。

我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变。另一个需要注意的是,使用列表作为函数的默认参数时,列表的内容变化情况。

首先,我们看以下的代码例子:

def add(x, lst=[]):

if x not in lst:

lst.append(x)

return lst

def main():

list1 = add(1)

print(list1)

list2 = add(2)

print(list2)

list3 = add(3, [11, 12, 13, 14])

print(list3)

list4 = add(4)

print(list4)

main()

你可能以为输出的结果会是:

[1]

[2]

[11, 12, 13, 14, 3]

[4]

但事实上,该程序输出的结果是:

[1]

[1, 2]

[11, 12, 13, 14, 3]

[1, 2, 4]

这是为什么呢?函数add的功能是当x不在列表中时,将x追加给列表lst。当函数第一次执行时,参数lst的默认值[]被创建。这个默认值只会被创建一次。add(1)将1加到lst。当函数再次被调用时,lst是[1]而不是[],因为lst只被创建一次。当参数的lst为[11,12,13,14]时,lst就是[11,12,13,14]。list4调用函数时,使用默认参数,因此,现在默认参数lst为[1,2]。

为了更好地理解调用情况,可以在add函数中输出lst的id,如以下代码:

def add(x, lst=[]):

print(id(lst))

if x not in lst:

lst.append(x)

return lst

def main():

list1 = add(1)

print(list1)

list2 = add(2)

print(list2)

list3 = add(3, [11, 12, 13, 14])

print(list3)

list4 = add(4)

print(list4)

main()

输出结果如下:

4469603648

[1]

4469603648

[1, 2]

4469670472

[11, 12, 13, 14, 3]

4469603648

[1, 2, 4]

可以看到,list1, list2, list4调用时默认参数的id并没有发生改变,而list3的id发生了改变。

这是Python使用列表作为默认参数的一个坑。那么,如何避免踩坑呢?如果想要使用默认列表在每次函数调用时都是[],可以像下面的程序那样修改函数参数:

def add(x, lst=None):

if lst is None:

lst = []

if x not in lst:

lst.append(x)

return lst

def main():

list1 = add(1)

print(list1)

list2 = add(2)

print(list2)

list3 = add(3, [11, 12, 13, 14])

print(list3)

list4 = add(4)

print(list4)

main()

输出的结果如下:

[1]

[2]

[11, 12, 13, 14, 3]

[4]

本次分享到此结束,感谢阅读~

注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

python默认参数举例_Python之在函数中使用列表作为默认参数相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 函数中的形式参数和实际参数

    1.举例:使用函数交换两个整形变量的值 运行结果: 分析: c语言中实际参数和形式参数之间采用值传递的方式来传递数据.在被调函数中,使用的是实际参数的一个拷贝数据.我们在swap函数中交换了a和b,那 ...

  7. R语言通过在函数中设置na.rm=TRUE参数、在计算和分析中删除缺失值获得有效的计算结果(Excluding Missing Values from Analyses)

    R语言通过在函数中设置na.rm=TRUE参数.在计算和分析中删除缺失值获得有效的计算结果(Excluding Missing Values from Analyses) 目录

  8. python调用函数传参时、有默认值的在中间 报错了_python的大坑:使用空列表作为默认参数,让我怀疑遇到了灵异代码...

    在python中,不要使用列表或者其他可变类型的数据容器作为默认参数.否则你很可能会遇到奇奇怪怪的问题. 如果你在调用某一个函数时,传了同样的参数,手动执行,每次结果都正确.但是用循环遍历重复多次执行 ...

  9. python默认参数举例_Python中的默认参数详解

    文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对 ...

最新文章

  1. oracle spacial,Oracle Spacial(空间数据库)geometry元数据结构
  2. c#中textbox属性_C#.Net中的TextBox.MaxLength属性与示例
  3. Redis简单命令(部分示例代码)
  4. 把Python项目打包成exe文件
  5. 哪一瞬间让你下定决心减肥,并且坚定不移的执行,最终瘦身成功?
  6. C#通过对象属性名修改值
  7. Struts2-2.了解struts.xmlpackageactionresult的name属性
  8. Oracle基础 10 表 table
  9. JavaScript GET 和 POST 请求的区别详解
  10. java人脸识别Demo(数据库mongo)
  11. 用树莓派3B+实现智能语音识别
  12. wwwscan批处理配置
  13. 国外苹果id_爆料者称苹果仍在继续研发iPhone屏下Touch ID
  14. 笨方法刷博客_C实现
  15. 针对从 Apple 购买的 App 或内容申请退款
  16. ajax localhsot,ajax请求nodejs后台,开启服务器后,localhost:3000/index.html页面既没有报错,也没有文字。。。...
  17. java编程根据订单编号查询订单状态_Java微信订单查询
  18. 【机器学习】决策树(Decision Tree)
  19. win10系统下如何打开bios如何打开Intel-VT-x教程
  20. android 开启手电筒,android 9.0 获取手电筒状态以及打开/关闭手电筒

热门文章

  1. python print换行_Python中九九乘法表与古诗对话机器人及sep-end值
  2. 实战分享|数据驱动「付费转化」的3个思路
  3. 什么是 ecommerce 的 distributor 概念以及如何实现 website redirect
  4. SAP Spartacus B2B Org Unit树状结构的ghost数据
  5. SAP Spartacus里product数据请求的HTTP url是在哪里维护的
  6. SAP Spartacus store里引用的library是如何编译出来的
  7. SAP Cloud Platform approuter的本地安装
  8. why there is always popup window for HANA
  9. SAP UI5 message.showMessageToast
  10. mUrlPrefixes内entry的population逻辑