python 函数默认参数的小坑
默认参数和可变对象
在执行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 函数默认参数的小坑相关推荐
- python 函数 默认参数
python 函数 默认参数 def add(a=1, b=2): # a,b设置默认参数c = a + breturn c c = add(a=2) # 如果不填,就是默认参数 print(c) 4
- 软件测试学习 之 Python 函数默认参数
转载说明 作者:珞樱缤纷 出处:博客园 博文:Python进阶-函数默认参数 Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的 ...
- Python函数默认参数陷阱
阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]): li.append(v) ret ...
- [python]函数默认参数顺序问题
python 函数参数定义有四类: 1.必选参数:调用函数时候必须赋值的参数. a,须以正确的顺序传入函数 b,调用时的数量必须和声明时的一样 def exa(x):return x#b作为参数进入函 ...
- python函数默认参数_Python中函数的默认参数问题
前几天,运营反馈了一个BUG,某些数据在写入数据库后,其时间字段出现异常,与当前时间相差较多. 由于代码是不是我写的,所以开始一遍阅读代码一遍排查问题. 在主流程中,仅仅发现了一个对时间赋值的语句,并 ...
- python函数默认参数位置_二十二、Python函数参数类型(位置、关键字、默认、不定长参数)...
调用函数时可使用的参数类型 在调用Python函数时可使用的参数类型主要有以下几种: 必要参数(位置参数) 关键字参数 默认参数 不定长参数 必要参数(位置参数) 在Python中, 必要参数必须以正 ...
- Python函数默认参数为空列表
示例: -测试命名比较随意- # foo?对象 def add(foo=[]):"""传入的参数为变量foo,指向的[]在定义函数之前创建,而不是每次执行前重新创建一个 ...
- python函数参数定义顺序_[python]函数默认参数顺序问题
1.python2.python3 三者顺序是:位置参数.默认参数.*args def foo(x,y=1,*args):passfoo (1,2,3,4,5) // 其中的x为1,y=1的值被2替换 ...
- python函数默认参数作用域
当def函数参数默认值为对象时,例如列表[],字典{} 示例1:猜测一下,会输出什么??? def ddd(a,b=[]):b.append(a)return bprint(ddd(1)) print ...
最新文章
- 有助于建立使用者对套件的信任 GitHub释出管理服务
- Ubuntu安装中文语言包
- 简单的Net::FTP模块的简单应用
- 新手指引,php什么是常量、变量、数组、类和对象及方法?
- httping的使用介绍
- 20200708每日一句
- SQLite: 关于日期的标准化问题
- 【孟姜女日记1】网安入门——渗透基础知识了解
- html视频长宽代码,html插入视频,html添加视频的代码
- 电机调速程序c语言,直流电机调速控制系统的C语言程序
- gom引擎物品和武器的外观Shape值拓展算法
- 树莓派pythongpio编程_基于树莓派的python GPIO编程-常用函数综合整理
- 2022蓝桥杯——砍竹子
- 数字逻辑课上如何制作FPGA游戏?
- Verilog设计流水灯(一)
- 梅州通风柜设计安装那些事
- Windows下的你画我猜 -- 告别效率低下的目录扫描方法
- redis 之sentinel配置
- 北大igem生物计算机,北京大学iGEM团队在国际大赛中取得优异成绩
- 互联网大公司和小公司的区别
热门文章
- PyPA Installing Packages
- 编程语言对比 异常处理
- C语言把整数转换为字符串
- html5字体转换,图片转字符画html5版
- android教程1009无标题,Android ActionBarActivity设置全屏无标题实现方法总结_Android_脚本之家...
- 怎么烧录c语言_单的入门1 -- C语言 : 一门和芯片对话的外语
- 阿里云-流量控制策略
- FastDFS(提升磁盘IO性能的几个技巧 FastDFS 5.04之IO读事件)
- Java基础学习总结(170)——Java8并发工具类CompletableFuture学习总结
- Spring Boot学习总结(7)——SpringBoot之于Spring优势