python函数中把列表(list)当参数时的"入坑"与"出坑"
在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:
def f(x,li=[]): print(id(li)) # 添加打印id for i in range(x): li.append(i*i) print(li) # Python学习交流QQ群:857662006 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:
def f(x,li=[]): print(id(li)) for i in range(x): li.append(i*i) print(li) # Python学习交流QQ群:857662006 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=[ ], 所以会产生以上结果.
优化
如果想要达到预期的结果,只需要在函数体里进行判断即可:
def f(x, li=[]): if not li: # Python学习交流QQ群:857662006 # 如果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]
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python学习笔记(1):配置虚拟开发环境
问题 有的时候开发不同的业务,所需要的环境不一样。一直在同一个环境中开发时候,不同的包版本升级可能会导致另外的业务不能正常工作。另外,有的github上的项目需要的开发环境与你使用的环境不同,冒然的按照它的requirements安装相应的包会产生类似的问题。一般而言,针对这种情况,对不同的业务,如果是存在依赖包存在版本升降级问题,常规的办法是对不同的业务创建不同的虚拟环境,在各个业务下,先进入虚拟环境,然后需要那种依赖包再进行安装,这样就不会产生版本不一样,或者版本升级导致的其它业务不能正常工作这一问题了。 解决办法 Mac Os 系统 安装 pip Pip , Python数据包的安装器, 其官方文档介绍在此.一般而言,当安装好python3后,pip也随之安装。如果获得如下错误 pip command not found 使用下面的命令安装pip: sudo easy_install pip 安装 virtualenv virtualenv 是一个创建隔离python项目的工具。类似于将各个项目的python及依赖包进行隔离。输入下面命令进行安装 sudo pip install...
- 下一篇
WxJava 3.6.0 版本发布
本次版本更新主要是微信支付模块增加了刷脸支付和分账的相关接口,小程序模块增加了订阅消息发送接口,公众号模块增加了图像处理接口,完善补充了更多的卡券接口,同时还实现了微信开放平台模块的 Spring Boot Starter 方便 Spring Boot 应用快速接入微信开放平台开发,并修复了各个模块新发现的部分bug,优化重构规范化了部分代码。具体更新日志如下: 微信支付 #1010 增加微信分账相关接口 #1241 修正下载对账单接口中错误代码“NO Bill Exist”字符串与实际不一致问题 #1161 微信支付修复EntPayRequest类的toString方法问题 #1164 微信支付模块去除一些多余的错误日志输出 #1248 增加微信刷脸支付支持相关接口 #1211 修复WxPayApiData类里toString方法的错误代码 公众号 #1157 增加网络检测接口 #252 增加关闭已群发文章评论和查看指定文章的评论数据的接口 #858 修复批量添加卡券接口后推送事件被误判为重复消息的问题 #1182 修复公众号spring-boot-starter jedis依赖丢失...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7