默认参数的坑

定义一个函数,传入一个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. PL/SQL Developper导入导出数据库的方法及说明

    导出步骤 1 tools ->export user object 选择选项,导出.sql文件. 2 tools ->export tables-> Oracle Export 选择 ...

  2. nginx request_time 和upstream_response_time

    1.request_time 官网描述:request processing time in seconds with a milliseconds resolution; time elapsed ...

  3. stat/lstat函数使用

    1. 进程虚拟地址空间 2. stat函数 获取文件信息 #include <sys/types.h> #include <sys/stat.h> #include <u ...

  4. cookie与session的区别与关系

    cookie与session的区别 1. 存储位置不同 cookie存储在浏览器中 session存储在服务端里 2. 大小不同 cookie最大4K session由于是存在服务端,因此理论上没有大 ...

  5. Vertica系列:Vertica和Hadoop的互操作性

    Vertica 8和 Hadoop 集群的互操作性已经很不错的, 但这块肯定是Vertica研发的重点, 将来可能还有较大的变动. Vertica 集群 和 Hadoop 集群的两种布局方式 集群布局 ...

  6. C#正则表达式匹配

    1.匹配所有带括号的字符串 string s = "aaaa(bbb)ccc(ddd)eeee"; string pattern = "\\(\\w+\\)"; ...

  7. Groovy 设计模式 -- proxy & delegate

    Proxy https://en.m.wikipedia.org/wiki/Proxy 代理人 与 被代理人 是 一对一的关系. A proxy is an agent or substitute a ...

  8. PHP的核心配置详解

    1.PHP核心配置详解 代码在不同的环境下执行的结果也会大有不同,可能就因为一个配置问题,导致一个非常高危的漏洞能够利用:也可能你已经找到的一个漏洞就因为你的配置问题,导致你鼓捣很久都无法构造成功的漏 ...

  9. C# CancellationTokenSource 终止线程 CancellationTokenSource实现对超时任务的取消

    C# 使用 CancellationTokenSource 终止线程 使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用 ...

  10. mysql 5.7 ERROR 1054(42S22) Unknown column 'password' in ‘field list’ 报错

    mysql 忘记密码 报错?ERROR 1054(42S22) Unknown column 'password' in ‘field list’原因:5.7版本下的mysql数据库下已经没有pass ...