在学习中遇到的Python的一个坑,那就是使用列表作为默认参数。

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

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

  1. def add(x, lst=[]):
  2. if x not in lst:
  3. lst.append(x)
  4. return lst
  5. def main():
  6. list1 = add(1)
  7. print(list1)
  8. list2 = add(2)
  9. print(list2)
  10. list3 = add(3, [11, 12, 13, 14])
  11. print(list3)
  12. list4 = add(4)
  13. print(list4)
  14. main()

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

  1. [1]
  2. [2]
  3. [11, 12, 13, 14, 3]
  4. [4]

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

  1. [1]
  2. [1, 2]
  3. [11, 12, 13, 14, 3]
  4. [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,如以下代码:

  1. def add(x, lst=[]):
  2. print(id(lst))
  3. if x not in lst:
  4. lst.append(x)
  5. return lst
  6. def main():
  7. list1 = add(1)
  8. print(list1)
  9. list2 = add(2)
  10. print(list2)
  11. list3 = add(3, [11, 12, 13, 14])
  12. print(list3)
  13. list4 = add(4)
  14. print(list4)
  15. main()

输出结果如下:

  1. 4469603648
  2. [1]
  3. 4469603648
  4. [1, 2]
  5. 4469670472
  6. [11, 12, 13, 14, 3]
  7. 4469603648
  8. [1, 2, 4]

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

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

  1. def add(x, lst=None):
  2. if lst is None:
  3. lst = []
  4. if x not in lst:
  5. lst.append(x)
  6. return lst
  7. def main():
  8. list1 = add(1)
  9. print(list1)
  10. list2 = add(2)
  11. print(list2)
  12. list3 = add(3, [11, 12, 13, 14])
  13. print(list3)
  14. list4 = add(4)
  15. print(list4)
  16. main()

输出的结果如下:

  1. [1]
  2. [2]
  3. [11, 12, 13, 14, 3]
  4. [4]

Python在函数中使用列表作为默认参数的更多相关文章

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

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

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

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

  3. python函数中的位置参数、默认参数、关键字参数、可变参数区别

    一.位置参数 调用函数时根据函数定义的参数位置来传递参数. #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_d ...

  4. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  5. python eval函数,将列表样式的字符串转化为列表

    python eval函数,将列表样式的字符串转化为列表 >>> str_1 = '[1,2,3,4,5,6]'>>> type(str_1)<type 's ...

  6. Python函数中的列表

    在看21天的Python书中写出了一个陷阱,但没给出解释,以下为代码陷阱

  7. Python虚拟机函数机制之位置参数的默认值(五)

    位置参数的默认值 在Python中,允许函数的参数有默认值.假如函数f的参数value的默认值是1,在我们调用函数时,如果传递了value参数,那么f调用时value的值即为我们传递的值,如果调用时没 ...

  8. python中使用list作为默认参数且调用时不给其赋值的问题

    最近在写代码时发现一个有趣的地方,当python中的函数使用list作为默认参数且调用时不给其赋值时,无法通过在函数中将其赋值为[]来达到清空此默认参数的目的.按照道理来说,函数f1中的list为局部 ...

  9. 多测师讲解python _函数中参数__高级讲师肖sir

    函数中讲解参数: 形参和实参的认识 函数无参数的调用 函数单个参数的调用 函数多个参数的调用 # #调试函数给默认参数传新值,则函数使用新值 # 注意:当多种参数同时出现在函数中,默认参数要放在最后的 ...

随机推荐

  1. JavaScript基础第01天笔记

    JavaScript基础第01天 1 - 编程语言 1.1 编程 编程: 就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程. 计算机程序: 就是计算机所执行的一系列的 ...

  2. 新手入门C语言第八章:C循环

    一.C 循环 有的时候,我们可能需要多次执行同一块代码.一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推.编程语言提供了更为复杂执行路径的多种控制结构.循环语句允许 ...

  3. JavaScript一行代码获取公网IP及城市信息

    废话不多说,直接上代码! <script type="text/javascript" src="http://pv.sohu.com/cityjson?ie=ut ...

  4. 【vue】$attrs的作用和使用方法

    之前一直不了解$attrs的作用和使用场景,然后自己翻阅了相关资料整理了下,如有不对的地方请大家指教 $attrs: $attrs是vue版本2.40以上新增的属性: 使用场景: vue项目里面,大家 ...

  5. @Resource与构造函数踩坑

    (虽然解决了需求,但我还是没搞懂为什么构造函数结束后,调用userMapper注入还是为空!) 首先,我有一个没有问题的userMapper类,用于处理user的数据库处理. 其次,我在另一个类里面使 ...

  6. MySQL基础入门(1)

    MySQL基础入门(1) 为什么学习MySQL 关系数据库管理系统(Relational Database Management System, RDBMS)是一种极为重要的工具,其应用十分广泛,从商 ...

  7. vue3 数据可视化项目

    可视化面板介绍 ​ 应对现在数据可视化的趋势,越来越多企业需要在很多场景(营销数据,生产数据,用户数据)下使用,可视化图表来展示体现数据,让数据更加直观,数据特点更加突出. 01-使用技术 完成该项目 ...

  8. 如何在Web前端实现CAD图文字全文搜索功能之技术分享

    现状 在CAD看图过程中我们经常会需要用到查找文字的功能,在AutoCAD软件查找一个文字时,可以通过打开左下角输入命令find,输入查找的文字,然后设置查找范围,就可以搜索到需要查询的文字.但在We ...

  9. FreeRTOS --(17)任务通知浅析

    转载自https://blog.csdn.net/zhoutaopower/article/details/107467305 在 FreeRTOS 中,还有一个东西也可以用作任务与任务,中断与任务的 ...

  10. ChCore Lab1 机器启动 实验笔记

    本文为上海交大 ipads 研究所陈海波老师等人所著的<现代操作系统:原理与实现>的课程实验(LAB)的学习笔记的第一篇. 书籍官网:现代操作系统:原理与实现,里面有实验的参考指南和代码仓 ...