(转)python中函数参数中如果带有默认参数list的特殊情况
在python中函数参数中如果带有默认参数list遇到问题
先看一段代码
|
1
2
3
4
5
6
7
8
9
|
def f(x,l=[]): for i in range(x): l.append(i*i) print(l)print('---1---')f(4)print('---2---')f(5) |
执行结果:
|
1
2
3
4
|
---1---[0, 1, 4, 9]---2---[0, 1, 4, 9, 0, 1, 4, 9, 16] |
预期的结果为:
|
1
2
3
4
|
---1---[0, 1, 4, 9]---2---[0, 1, 4, 9, 16] |
问题解释:当定义函数时,会保存函数中默认参数list的值,也就是列表[],在每次调用的时候如果传递了列表,则使用传递的列表,没有传递,使用定义函数时保存的默认参数list,以上案例中两次调用都没有传递默认参数list,程序会调用定义函数时,保存的默认参数list,列表在append的时候回在原来的基础上添加,所以会产生以上结果,我们可以通过打印id看出。
修改代码:
|
1
2
3
4
5
6
7
8
9
10
11
|
def f(x,l=[]): print(id(l)) # 添加打印id for i in range(x): l.append(i*i) print(l)print('---1---')f(4)print('---2---')f(5) |
结果:
|
1
2
3
4
5
6
|
---1---140306123906248[0, 1, 4, 9]---2---140306123906248[0, 1, 4, 9, 0, 1, 4, 9, 16] |
会发现id值是相同的,说明两次执行时使用的都是定义函数时默认的参数
再次修改代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def f(x,l=[]): print(id(l)) for i in range(x): l.append(i*i) print(l)print('---1---')f(4)print('---2---')f(5,[])print('---3---')f(6) |
结果:
|
1
2
3
4
5
6
7
8
9
|
---1---140017293614280[0, 1, 4, 9]---2---140017293614472[0, 1, 4, 9, 16]---3---140017293614280[0, 1, 4, 9, 0, 1, 4, 9, 16, 25] |
会发现执行传递空列表的函数时打印的id不一样,而没有传递的一样。当传递空list时函数体当中会使用传递的空list,没有传递时,使用函数默认的list。所以会产生以上结果
如果想要达到预期的结果编写一下代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
def f(x,l=None): if l is None: l = [] for i in range(x): l.append(i*i) print(l)print('---1---')f(4)print('---2---')f(5)print('---3---')f(6) |
结果:
|
1
2
3
4
5
6
|
---1---[0, 1, 4, 9]---2---[0, 1, 4, 9, 16]---3---[0, 1, 4, 9, 16, 25] |
这样就达到了预期的结果 ------_<_>_------
(转)python中函数参数中如果带有默认参数list的特殊情况的更多相关文章
- python函数参数中带有默认参数list的坑
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 def f(x,l=[]): for i in range(x): l.append(i*i) print(l) print( ...
- Python中函数的参数传递与可变长参数
转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...
- python的函数定义中99%的人会遇到的一个坑
列表是一种经常使用的数据类型.在函数的定义中,常常会使用列表作为参数. 比如,要测试一个接口的数据,接口返回的数据格式如下: { "code": "20000" ...
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- C++ (带有默认参数的函数参数)缺省函数参数
缺省参数?在C++中,允许实参的个数与形参的个数不同.在声明函数原型时,为一个或者多个形参指定默认值,以后调用这个函数时,若省略某一个实参,c++则自动的以默认值作为相应参数的值. 实列说明:#inc ...
- swift中_的用法,忽略默认参数名。
swift中默认参数名除了第一个之外,其他的默认是不忽略的,但是如果在参数的名字前面加上_,就可以忽略这个参数名了,虽然有些麻烦,但是这种定义也挺好,而且不想知道名字或者不想让别人知道名字的或者不用让 ...
- Python虚拟机函数机制之位置参数的默认值(五)
位置参数的默认值 在Python中,允许函数的参数有默认值.假如函数f的参数value的默认值是1,在我们调用函数时,如果传递了value参数,那么f调用时value的值即为我们传递的值,如果调用时没 ...
- [python][oldboy]关键字参数和位置参数,默认参数,可变长参数(无名,有名)
关键字参数和位置参数是在函数调用的时候定义 关键字参数是以键-值对出现,无序,多一个不行,少一个不行 位置参数,有序,多一个不行,少一个不行 混搭:所有位置参数必须在关键字参数的左边 默认参数是在函数 ...
- jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数
在使用validation进行唯一性验证时,想各个模块写一个统一的方法,相统一参数名称,但是remote方法会默认把对应的参数传过去 如: 会把role.roleName默认作为变量提交过去 所以想自 ...
随机推荐
- 使用 spring封装的javamail linux服务器发送邮件失败解决
原文参考:https://blog.csdn.net/a540891049/article/details/79385471 由于某些平台的linxu服务器为了安全起见 屏蔽了发送邮件的常用端口 25 ...
- 显式拥塞通告(ECN)及其在Linux上的实现
1 ECN简介 首先看看ECN握手报文的特点,根据RFC3168,ECN握手报文IP头部不能够设置ECT和CE位的 SYN报文TCP标志字段的CWR和ECE位被置1 SYN-ACK报文的CWR位被置0 ...
- 阿里云oss c# api 的使用 的使用
API 文档下载地址:http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32085/cn_zh/1515493045734 ...
- spring的bean创建过程
Spring的bean创建过程 步骤 执行过程 描述 1 ThreadLocal.set bean创建之前将beanName的一些属性放进ThreadLocal,避免多线程创建bean导致问题,并发创 ...
- 前段学习的roadmap
引自http://www.cnblogs.com/IMxinu/p/9693041.html
- Mantis:Mantis rest api url 404 Not Found.解决过程纪录
测试Mantis rest api时碰到的问题:404 Not Found. 根据文件,Mantis rest api的预设url是{{url}}/api/rest/{{controller}}. 其 ...
- spyder常用功能
最近和同学讨论到spyder的使用技巧,所以就结合之前在网上看到网友的总结( https://blog.csdn.net/peiwang245/article/details/78528098)和自己 ...
- python网络之web框架
逐步引入: 1. 最简单的web server #!/usr/bin/env python # coding:utf-8 import socket sk = socket.socket() sk.b ...
- IP通信基础课堂笔记----简答题
1.局域网优点:局域网特点(5) 2.10BASE-T技术特性(8) 3.网桥/交换机的优点(3):缺点(3) 4.虚拟局域网特点(4) *转发表或原MAC地址规则:记录源MAC地址 *VLAN帧格式 ...
- 运维rpm语法
Linux软件包分类 rpm 常用命令1.安装一个包 # rpm -ivh 2.升级一个包 # rpm -Uvh 3.卸载一个包 # rpm -e 4.安装参数 --force 即使覆盖属于其它包的文 ...