(转)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默认作为变量提交过去 所以想自 ...
随机推荐
- paramiko向服务器自动上传下载文件
import paramikoimport os def download_from(ip,u,p): file_list=['file2',file3','file4'] file_path=&qu ...
- vue双向数据绑定
本文来源于 https://jingyan.baidu.com/article/91f5db1b0c2a4f1c7f05e3a8.html
- HashMap jdk1.8 jdk1.7 put改动
之前hashmap处理冲突单纯使用链表法进行链接,1.8中,当一散列值中对应的链表长度超过8个后,会将链表转化为红黑树进行存储. 1.8中源码 public V put(K key, V value) ...
- 用tensorflow实现最简单的神经网络
import tensorflow as tfimport numpy as np def add_layer(inputs,in_size,out_size,activation_function= ...
- el和jstl标签库讲解视频
https://www.bilibili.com/video/av22415283/?p=1
- python的迭代器
迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...
- Visitor 模式心得
最近读到Visitor模式,还是一知半解的.偶然翻到Uncle Bob对该模式的推导过程,有所心得,和大家分享一下. Uncle Bob 的链接是: http://butunclebob.com/Ar ...
- APICloud-数据存储
APICloud 共有四种数据存储 1.file:目录操作,文件操作 文件存储方式,用于图片.文档的上传.下载.删除.管理. 2.db:本地 sqlite 数据库 用于离散数据的存储. 3.loacl ...
- Qt 文件的操作
文件操作是应用程序必不可少的部分.Qt 作为一个通用开发库,提供了跨平台的文件操作能力.从本章开始,我们来了解下 Qt 的文件以及输入输出的功能,也就是 I/O 系统. Qt 通过QIODevice提 ...
- OpenGL之shader着色器的应用,三色渐变的三角形
学习自: https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/#_7 首先放一张效果图: 本次教程,将着色器单独定 ...