默认参数的坑

定义一个函数,传入一个list,添加一个end再返回

1
2
3
def  add_end(L=[]):
    L.append('END')
    return L

正常调用时,结果似乎不错

1
print  add_end([1,2,3])  #[1, 2, 3, 'END']

使用默认参数调用时,一开始结果也是对的,但是再次调用时,结果就不对了

1
2
3
4
5
print add_end()   #['END']
 
print add_end()    #['END', 'END']
 
print  add_end()    #['END', 'END', 'END']

从上述调用结果发现,函数每次都记住了上次添加了‘END’后的list,python函数在定义的时候,默认参数L的值就被计算出来了即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变 了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了

所以,定义默认参数要牢记一点:默认参数必须指向不变对象

修改上面的例子,可以用None这个不变对象来实现

1
2
3
4
5
def  add_end2(L=None):
    if is None:
        L=[]
    L.append('END')
    return  L

无论调用多少次都没问题

1
2
3
4
5
6
print add_end2()
print  add_end2()
print  add_end2()
#['END']
#['END']
#['END']

不变对象一旦创建,对象内部的数据就不能修改,这样就减少了由于修改数据导致的错误。此外,由于对象不变,多任务环境下同时读取对象不需要加锁,同时读一点问题都没有。我们在编写程序时,如果可以设计一个不变对象,那就尽量设计成不变对象。

不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)
可变(mutable):字典型(dictionary)、列表型(list)

默认参数的坑

定义一个函数,传入一个list,添加一个end再返回

1
2
3
def  add_end(L=[]):
    L.append('END')
    return L

正常调用时,结果似乎不错

1
print  add_end([1,2,3])  #[1, 2, 3, 'END']

使用默认参数调用时,一开始结果也是对的,但是再次调用时,结果就不对了

1
2
3
4
5
print add_end()   #['END']
 
print add_end()    #['END', 'END']
 
print  add_end()    #['END', 'END', 'END']

从上述调用结果发现,函数每次都记住了上次添加了‘END’后的list,python函数在定义的时候,默认参数L的值就被计算出来了即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变 了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了

所以,定义默认参数要牢记一点:默认参数必须指向不变对象

修改上面的例子,可以用None这个不变对象来实现

1
2
3
4
5
def  add_end2(L=None):
    if is None:
        L=[]
    L.append('END')
    return  L

python3 - 默认参数为列表的更多相关文章

  1. python3默认参数陷阱

    默认参数的值是容器类型,每次调用函数的时候,如果不传值,会用公用资源池 def func(k, v=[]): v.append(k) print(v) func('wt') func('ab', [] ...

  2. python3 函数的形参、实参、位置参数、默认参数、关键字参数以及函数的递归

    python 版本 3.5 #Author by Andy#_*_ coding:utf-8 _*_def func(x,y=2): print('我是形参%s'%x) print('我是默认参y-- ...

  3. Python之在函数中使用列表作为默认参数

      本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数.   我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使 ...

  4. 获取列表数据时,getList 设置默认参数:getList(page = 1),点击分页及前往时,传page参数,其他使用page的默认值:1

    获取列表数据时,getList 设置默认参数:getList(page = 1),点击分页及前往时,传page参数,其他使用page的默认值:1

  5. Python——可变类型与不可变类型(即为什么函数默认参数要用元组而非列表)

    Python 的内建标准类型有一种分类标准是分为可变类型与不可变类型: 可变类型:列表.字典 不可变类型:数字.字符串.元组 因为变量保存的实际都是对象的引用,所以在给一个不可变类型(比如 int)的 ...

  6. Python在函数中使用列表作为默认参数

    在学习中遇到的Python的一个坑,那就是使用列表作为默认参数. 我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变.另一个需要注意的是,使用列表作为函数的默认参 ...

  7. python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs

    1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...

  8. [python 函数学习篇]默认参数

    python函数: 默认参数: retries= 这种形式 def ask_ok(prompt, retries=, complaint='Yes or no, please!'): while Tr ...

  9. Python3基本数据类型之列表

    1.初识列表 列表(List)是Python3中的"容器型"数据类型. 列表通过中括号把一堆数据括起来的方式形成,列表的长度不限. 列表里面的元素可以是不同的数据类型,但是一般是相 ...

随机推荐

  1. POJ3417 LCA+树dp

    http://poj.org/problem?id=3417 题意:先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂 ...

  2. npx小工具

    npm v5.2.0引入的一条命令(npx),引入这个命令的目的是为了提升开发者使用包内提供的命令行工具的体验. 举例:使用create-react-app创建一个react项目. 老方法: npm ...

  3. 2017-12-15python全栈9期第二天第七节之运算符

    #!/user/bin/python# -*- coding:utf-8 -*-print(3>4 or 4<3 and 1==1)print(1<2 and 3 <4 or ...

  4. 数据库基础SQL知识面试题一

    数据库基础SQL知识面试题一 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 如标题所示,本篇博客主要介绍基础知识的面试题.大家可以用来测试面试者的技术水平,由于个人水平所限,难免 ...

  5. Linux CGroup

    catalog . 引言 . Cgroup安装配置 . Cgroup使用方式 . CGroup的子系统 1. 引言 我们已经讨论了Linux下命名空间(Namespace)的基本知识,详情请参阅另一篇 ...

  6. java io系列20之 PipedReader和PipedWriter

    本章,我们学习PipedReader和PipedWriter.它们和“PipedInputStream和PipedOutputStream”一样,都可以用于管道通信. PipedWriter 是字符管 ...

  7. Ubuntu 开启SSH服务以及有关设置:安装,指定端口号、免密登录、远程拷贝

    本文所用系统为 Ubuntu 18.04   什么是SSH?     简单说,SSH是一种网络协议,用于计算机之间的加密登录.全名为:安全外壳协议.为Secure Shell的缩写.SSH为建立在应用 ...

  8. 加密PDF文件的打印问题

    工作中遇到网上下载的PDF文件加密,并且不能打印 解决方法: 1.解密: 去网站下载解密软件,1M左右:http://www.onlinedown.net/soft/19939.htm 直接解压,运行 ...

  9. sql 三表左外链接的2种写法【原】

    初始化语句 DROP TABLE student; ) )); ','bobo'); ','sisi'); ','gugu'); ','mimi'); DROP TABLE room; ) ),roo ...

  10. openstack ovs实现vlan组网

    本文是配置文档,非说明文档,只讲配置,不讲原理. controller节点: 网卡信息:ens160 外网网卡 : ens192 数据网卡 /etc/neutron/plugins/ml2/ml2_c ...