在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. 使用 spring封装的javamail linux服务器发送邮件失败解决

    原文参考:https://blog.csdn.net/a540891049/article/details/79385471 由于某些平台的linxu服务器为了安全起见 屏蔽了发送邮件的常用端口 25 ...

  2. vue+uwsgi+nginx部署路飞学城

    vue+uwsgi+nginx部署路飞学城   有一天,老男孩的苑日天给我发来了两个神秘代码,听说是和mjj的结晶 超哥将这两个代码,放到了一个网站上,大家可以自行下载 路飞学城django代码 ht ...

  3. using Newtonsoft.Json;

    using Newtonsoft.Json;    //数组转义为json  string result = JsonConvert.SerializeObject(list1);   //josn转 ...

  4. 本地pip 源搭建起来

    pip install pip2pi pip2tgz target_dir -r requirement.txt 下载想要的本地的py包  /usr/local/python3/bin/dir2pi ...

  5. hadoop2.6.0高可靠及yarn 高可靠搭建

    以前用hadoop2.2.0只搭建了hadoop的高可用,但在hadoop2.2.0中始终没有完成YARN HA的搭建,直接下载了hadoop最新稳定版本2.6.0完成了YARN HA及HADOOP ...

  6. 小程序wx.chooseImage的坑

    选择图片后可能重新执行onshow()和onhide(),可以在页面中添加锁变量,选择图片前获取,选择完释放,onshow中利用锁来中断执行

  7. python练习:实现一个整数数组里面两个数之和为183的所有整数对

    l1 = [183,0,1,2,-184,367] num = [] for i in range (0,len(l1)): for l in range (i+1,len(l1)): if l1[i ...

  8. opendaylight-O版本与openstack集成

    feature:list list (Lists all existing features available from the defined repositories) feature:list ...

  9. Wpf binging(一) 基础

    1.C# 代码后台绑定 分别步骤为 1. 准备数据源 2.实例化 binging对象   以及设置 该对象的 数据源 和数据源的访问路径(也就是该数据源的什么属性绑定) 3. 把前端ui控件的 Tex ...

  10. 路径定义前+r

    定义文件路径时前面加个r 例如 firstfolder = r"C:\Users\1261\Desktop\" 不对其中的符号进行转义