(转)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默认作为变量提交过去 所以想自 ...
随机推荐
- maven jstl The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application
maven jstl 报错 HTTP Status 500 – Internal Server Error Type Exception Report Message The absolute uri ...
- 输入系统:进程间双向通信(socketpair+binder)
一.双向通信(socketpair) socketpair()函数用于创建一对无名的.相互连接的套接子,如果函数成功,则返回0,创建好的套接字分别是sv[0]和sv[1]:否则返回-1,错误码保存于e ...
- 用svm来做回归预测(python)
————————————————————***提醒自己结束了就发博客***————————————————————
- JavaWeb开发流程
- μCOS-Ⅲ——常用注意事项
**1,**main函数在调用其他函数之前必须先调用OSInit()函数对内核进行初始化. 2,所有的错误类型码都以OS_ERR_为前缀, 3,命名时尽量统一个格式,所有的函数.变量.宏定义和#def ...
- RF新手常见问题总结
RF新手常见问题总结--(基础篇) 1. 经常有人问这个元素找不到,一般先排除这两个地方,再自己找找A:是否等待了足够的时间让元素加载 (增加sleep xx, wait Until xxx)B: ...
- 使用Pretues仿真Arduino驱动步进电机
这几天想做一个给金鱼自动喂食的装置,所以学习了下如何操控步进电机,现在做个记录. 使用Pretues仿真Arduino的话,可以参考:http://www.geek-workshop.com/thre ...
- Linux 下使用umount强行卸载设备
卸载NFS,结果出现无法卸载的情况 [root@localhost /]# umount /udisk/ umount: /udisk: device is busy umount: /udisk: ...
- 网络原因导致的 spring cloud config 读取git上的配置文件时报错:Cannot clone or checkout repository
今天在公司使用spring cloud config搭建配置中心的时候,出现了读取不到git库的问题:Cannot clone or checkout repository.在网上百度,前面几个答案都 ...
- 4--Postman--Request&Response
//var josndata=JSON.parse(responseBody);//获取body中返回的所有参数//tests["code"]=josndata.code===20 ...