在python中函数参数中如果带有默认参数list遇到问题

先看一段代码

1
2
3
4
5
6
7
8
9
def f(x,l=[]):
    for in range(x):
        l.append(i*i)
    print(l)
 
print('---1---')
f(4)
print('---2---')
f(5)

执行结果:

1
2
3
4
---1---
[0149]
---2---
[0149014916]

预期的结果为:

1
2
3
4
---1---
[0149]
---2---
[014916]

问题解释:当定义函数时,会保存函数中默认参数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 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
[0149]
---2---
140306123906248
[0149014916]

会发现id值是相同的,说明两次执行时使用的都是定义函数时默认的参数

再次修改代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
def f(x,l=[]):
    print(id(l))
    for 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
[0149]
---2---
140017293614472
[014916]
---3---
140017293614280
[014901491625]

会发现执行传递空列表的函数时打印的id不一样,而没有传递的一样。当传递空list时函数体当中会使用传递的空list,没有传递时,使用函数默认的list。所以会产生以上结果

如果想要达到预期的结果编写一下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def f(x,l=None):
    if is None:
        = []
    for 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---
[0149]
---2---
[014916]
---3---
[01491625]

 这样就达到了预期的结果  ------_<_>_------

(转)python中函数参数中如果带有默认参数list的特殊情况的更多相关文章

  1. python函数参数中带有默认参数list的坑

    在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 def f(x,l=[]): for i in range(x): l.append(i*i) print(l) print( ...

  2. Python中函数的参数传递与可变长参数

    转自旭东的博客原文 Python中函数的参数传递与可变长参数 Python中传递参数有以下几种类型: (1)像C++一样的默认缺省函数 (2)根据参数名传参数 (3)可变长度参数 示例如下: (1)默 ...

  3. python的函数定义中99%的人会遇到的一个坑

    列表是一种经常使用的数据类型.在函数的定义中,常常会使用列表作为参数. 比如,要测试一个接口的数据,接口返回的数据格式如下: { "code": "20000" ...

  4. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  5. C++ (带有默认参数的函数参数)缺省函数参数

    缺省参数?在C++中,允许实参的个数与形参的个数不同.在声明函数原型时,为一个或者多个形参指定默认值,以后调用这个函数时,若省略某一个实参,c++则自动的以默认值作为相应参数的值. 实列说明:#inc ...

  6. swift中_的用法,忽略默认参数名。

    swift中默认参数名除了第一个之外,其他的默认是不忽略的,但是如果在参数的名字前面加上_,就可以忽略这个参数名了,虽然有些麻烦,但是这种定义也挺好,而且不想知道名字或者不想让别人知道名字的或者不用让 ...

  7. Python虚拟机函数机制之位置参数的默认值(五)

    位置参数的默认值 在Python中,允许函数的参数有默认值.假如函数f的参数value的默认值是1,在我们调用函数时,如果传递了value参数,那么f调用时value的值即为我们传递的值,如果调用时没 ...

  8. [python][oldboy]关键字参数和位置参数,默认参数,可变长参数(无名,有名)

    关键字参数和位置参数是在函数调用的时候定义 关键字参数是以键-值对出现,无序,多一个不行,少一个不行 位置参数,有序,多一个不行,少一个不行 混搭:所有位置参数必须在关键字参数的左边 默认参数是在函数 ...

  9. jquery validation remote进行唯一性验证时只使用自定义参数,不使用默认参数

    在使用validation进行唯一性验证时,想各个模块写一个统一的方法,相统一参数名称,但是remote方法会默认把对应的参数传过去 如: 会把role.roleName默认作为变量提交过去 所以想自 ...

随机推荐

  1. 执行git命令时出现fatal: 'origin' does not appear to be a git repository错误

    在执行git pull origin master时出现: fatal: 'origin' does not appear to be a git repository fatal: Could no ...

  2. HFun.快速开发平台(一)=》简述

    [——使用成熟的技术实现了解的业务,关注面向对象,关注业务领域] 偶然的机会又回到了园子,看到上次的文章已是N年前,洽巧近期正在开发一个小程序,标题定为“快速开发平台”有点夸张,算是给自己定个小目标. ...

  3. mybatis 报The content of elements must consist of well-formed character data or markup. 语法格式错误

    最近在写sql的时候 同时使用到了 >= 和 <= 之前只使用一个的时候 没有什么问题,今天同时使用到了两个,结果xml出现了The content of elements must co ...

  4. Git clone出现SSL certificate problem

    1 可以在cmd下,设置 git config --global http.sslVerify false git clone  XXX 即可. 2 TortoiseGit设置 打开TortoiseG ...

  5. 快速比较 Kafka 与 Message Queue 的区别

    https://hackernoon.com/a-super-quick-comparison-between-kafka-and-message-queues-e69742d855a8 A supe ...

  6. kubernetes二进制部署k8s-master集群controller-manager服务unhealthy问题

    一.问题现象 我们使用二进制部署k8s的高可用集群时,在部署多master时,kube-controller-manager服务提示Unhealthy [root@ceph-01 system]# k ...

  7. js 判断变量是否为空或未定义

    判断变量是否定义: if(typeof(hao) == "undefined"){ //未定义 }else{ //定义 } 判断变量是否为空或NULL,是则返回'', 反之返回原对 ...

  8. 第二次靶场练习:cookie注入

    cookie注入 本文章目的是对相关的黑客内容进一步了解,如有人违反相关的法律法规,本人概不负责 一.学习目的: 利用手工注入网站 利用sqlmab注入 二.附件说明 靶场网址:http://120. ...

  9. 服务器配置+wordpress建站(小白)

    一. 安装好centos7.2系统后,登录centos系统输入如下命令: yum install -y wget && wget -O install.sh http://downlo ...

  10. Redis学习笔记一

    Redis 与其他 key - value 缓存产品有以下三个特点:    Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用.    Redis不仅仅支持简单 ...