(转)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默认作为变量提交过去 所以想自 ...
随机推荐
- css制作倒三角
布局div,并命名为id="dropdown",在style使用border属性对div进行控制 #dropdown{ width:0px; height:0px; border- ...
- centos7搭建日志服务器
服务器端 修改配置文件 /etc/rsyslog.conf中 $ModLoad imudp $UDPServerRun 514 打开日志服务监听 修改/etc/sysconfig/rsyslog文件 ...
- Kubernetes 常用命令
文章摘自:https://blog.csdn.net/felix_yujing/article/details/51622132 1 查看类命令--- # 查看集群信息 kubectl cluster ...
- webpack 大概
entry output loader: rules: [ {test:匹配文件格式, use: 使用的loader}, {test:匹配文件格式, use: 使用的loader}, ...//l ...
- python 保留字符
False 假的 None 无 True 真的 and 和 as作为 assert 断言 break 打破 class 种类 continue 继续 def del 删除 elif 否则如果 else ...
- Main Steps to Setup an ODI data sync
0. Get ODI installed 1. Topo physical Architecture/new physical schema 2. New Logical schema 3. New ...
- Handler使用小结
个人概念里面handler用来更新UI.一直有一个问题困恼我,为什么我在主线程里面创建一个Handler不需要传递传递Looper,而在一个子线程里面必须调用Looper.prepare, Loope ...
- 目标检测(一) R-CNN
R-CNN全称为 Region-CNN,它是第一个成功地将深度学习应用到目标检测的算法,后续的改进算法 Fast R-CNN.Faster R-CNN都是基于该算法. 传统方法 VS R-CNN 传统 ...
- Codeforces Round #245 (Div. 1) B. Working out (dp)
题目:http://codeforces.com/problemset/problem/429/B 第一个人初始位置在(1,1),他必须走到(n,m)只能往下或者往右 第二个人初始位置在(n,1),他 ...
- 关于MySQL什么时候使用索引问题以及什么情况下应不建或少建索引
一,什么情况下使用索引1. 表的主关键字 自动建立唯一索引 2. 表的字段唯一约束 ORACLE利用索引来保证数据的完整性 3. 直接条件查询的字段 在SQL中用于条件约束的字段 如zl_yhjbqk ...