默认参数和可变对象

在执行def语句时,默认参数的值只被解析并保存一次,而不是每次在调用函数的时候。这通常是你想要的那样,但是因为默认值需要在每次调用时都保持同样对象,你在试图改变可变的默认值(mutable defaults)的时候可要小心了。例如,下面的函数中使用一个空的列表作为默认值,然后在之后每一次函数调用的时候改变它的值:

1
2
3
4
5
6
7
8
9
10
11
12
>>> def saver(x=[]):   # 保存一个列表对象
...     x.append(1)    # 并每次调用的时候
...     print x     # 改变它的值
...
>>> saver([2])         # 未使用默认值
[2, 1]
>>> saver()            # 使用默认值
[1]
>>> saver()            # 每次调用都会增加!
[1, 1]
>>> saver()
[1, 1, 1]

有的人将这个视作Python的一个特点——因为可变的默认参数在每次函数调用时保持了它们的状态,它们能提供像C语言中静态本地函数变量的类似的一些功能。但是,当你第一次碰到它时会觉得这很奇怪,并且在Python中有更加简单的办法来在不同的调用之间保存状态(比如说类)。

要摆脱这样的行为,在函数开始的地方用切片或者方法来创建默认参数的副本,或者将默认值的表达式移到函数里面;只要每次函数调用时这些值在函数里,就会每次都得到一个新的对象:

1
2
3
4
5
6
7
8
9
10
11
>>> def saver(x=None):
...     if x is None: x = []   # 没有传入参数?
...     x.append(1)            # 改变新的列表
...     print x
...
>>> saver([2])                 # 没有使用默认值
[2, 1]
>>> saver()                    # 这次不会变了
[1]
>>> saver()
[1]

转载于:https://www.cnblogs.com/briller/p/4244181.html

python 函数默认参数的小坑相关推荐

  1. python 函数 默认参数

    python 函数 默认参数 def add(a=1, b=2): # a,b设置默认参数c = a + breturn c c = add(a=2) # 如果不填,就是默认参数 print(c) 4

  2. 软件测试学习 之 Python 函数默认参数

    转载说明 作者:珞樱缤纷 出处:博客园 博文:Python进阶-函数默认参数 Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的 ...

  3. Python函数默认参数陷阱

    阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]): li.append(v) ret ...

  4. [python]函数默认参数顺序问题

    python 函数参数定义有四类: 1.必选参数:调用函数时候必须赋值的参数. a,须以正确的顺序传入函数 b,调用时的数量必须和声明时的一样 def exa(x):return x#b作为参数进入函 ...

  5. python函数默认参数_Python中函数的默认参数问题

    前几天,运营反馈了一个BUG,某些数据在写入数据库后,其时间字段出现异常,与当前时间相差较多. 由于代码是不是我写的,所以开始一遍阅读代码一遍排查问题. 在主流程中,仅仅发现了一个对时间赋值的语句,并 ...

  6. python函数默认参数位置_二十二、Python函数参数类型(位置、关键字、默认、不定长参数)...

    调用函数时可使用的参数类型 在调用Python函数时可使用的参数类型主要有以下几种: 必要参数(位置参数) 关键字参数 默认参数 不定长参数 必要参数(位置参数) 在Python中, 必要参数必须以正 ...

  7. Python函数默认参数为空列表

    示例:  -测试命名比较随意- # foo?对象 def add(foo=[]):"""传入的参数为变量foo,指向的[]在定义函数之前创建,而不是每次执行前重新创建一个 ...

  8. python函数参数定义顺序_[python]函数默认参数顺序问题

    1.python2.python3 三者顺序是:位置参数.默认参数.*args def foo(x,y=1,*args):passfoo (1,2,3,4,5) // 其中的x为1,y=1的值被2替换 ...

  9. python函数默认参数作用域

    当def函数参数默认值为对象时,例如列表[],字典{} 示例1:猜测一下,会输出什么??? def ddd(a,b=[]):b.append(a)return bprint(ddd(1)) print ...

最新文章

  1. 有助于建立使用者对套件的信任 GitHub释出管理服务
  2. Ubuntu安装中文语言包
  3. 简单的Net::FTP模块的简单应用
  4. 新手指引,php什么是常量、变量、数组、类和对象及方法?
  5. httping的使用介绍
  6. 20200708每日一句
  7. SQLite: 关于日期的标准化问题
  8. 【孟姜女日记1】网安入门——渗透基础知识了解
  9. html视频长宽代码,html插入视频,html添加视频的代码
  10. 电机调速程序c语言,直流电机调速控制系统的C语言程序
  11. gom引擎物品和武器的外观Shape值拓展算法
  12. 树莓派pythongpio编程_基于树莓派的python GPIO编程-常用函数综合整理
  13. 2022蓝桥杯——砍竹子
  14. 数字逻辑课上如何制作FPGA游戏?
  15. Verilog设计流水灯(一)
  16. 梅州通风柜设计安装那些事
  17. Windows下的你画我猜 -- 告别效率低下的目录扫描方法
  18. redis 之sentinel配置
  19. 北大igem生物计算机,北京大学iGEM团队在国际大赛中取得优异成绩
  20. 互联网大公司和小公司的区别

热门文章

  1. PyPA Installing Packages
  2. 编程语言对比 异常处理
  3. C语言把整数转换为字符串
  4. html5字体转换,图片转字符画html5版
  5. android教程1009无标题,Android ActionBarActivity设置全屏无标题实现方法总结_Android_脚本之家...
  6. 怎么烧录c语言_单的入门1 -- C语言 : 一门和芯片对话的外语
  7. 阿里云-流量控制策略
  8. FastDFS(提升磁盘IO性能的几个技巧 FastDFS 5.04之IO读事件)
  9. Java基础学习总结(170)——Java8并发工具类CompletableFuture学习总结
  10. Spring Boot学习总结(7)——SpringBoot之于Spring优势