Python函数参数默认值的陷阱和原理深究--根本原因_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
5
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3013 | 回复: 4   主题: Python函数参数默认值的陷阱和原理深究--根本原因        上一篇   下一篇 
    本主题由 Administrator 于 2019-3-2 21:06:04 移动
shellyC1314
注册用户
等级:少校
经验:1334
发帖:75
精华:0
注册:2015-7-14
状态:离线
发送短消息息给shellyC1314 加好友    发送短消息息给shellyC1314 发消息
发表于: IP:您无权察看 2015-9-1 11:00:43 | [全部帖] [楼主帖] 楼主

一句话来解释:Python函数的参数默认值,是在编译阶段就绑定的。

现在,我们先从一段摘录来详细分析这个陷阱的原因。下面是一段从Python Common Gotchas中摘录的原因解释:

Python’s default arguments are evaluated once when the function is defined, not each time the function is called (like it is in say, Ruby). This means that if you use a mutable default argument and mutate it, you will and have mutated that object for all future calls to the function as well.

可见如果参数默认值是在函数编译compile阶段就已经被确定。之后所有的函数调用时,如果参数不显示的给予赋值,那么所谓的参数默认值不过是一个指向那个在compile阶段就已经存在的对象的指针。如果调用函数时,没有显示指定传入参数值得话。那么所有这种情况下的该参数都会作为编译时创建的那个对象的一种别名存在。如果参数的默认值是一个不可变(Imuttable)数值,那么在函数体内如果修改了该参数,那么参数就会重新指向另一个新的不可变值。而如果参数默认值是和本文最开始的举例一样,是一个可变对象(Muttable),那么情况就比较糟糕了。所有函数体内对于该参数的修改,实际上都是对compile阶段就已经确定的那个对象的修改。

对于这么一个陷阱在 Python官方文档中也有特别提示:

Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes. For example, the following function accumulates the arguments passed to it on subsequent calls:


该贴由system转至本版2019-3-2 21:06:04



赞(0)    操作        顶端 
九州大陆
注册用户
等级:上等兵
经验:121
发帖:0
精华:0
注册:2016-3-22
状态:离线
发送短消息息给九州大陆 加好友    发送短消息息给九州大陆 发消息
发表于: IP:您无权察看 2016-3-28 18:55:53 | [全部帖] [楼主帖] 2  楼

谢谢分享



赞(0)    操作        顶端 
红色拖鞋
注册用户
等级:中士
经验:225
发帖:1
精华:0
注册:2016-2-17
状态:离线
发送短消息息给红色拖鞋 加好友    发送短消息息给红色拖鞋 发消息
发表于: IP:您无权察看 2016-3-28 21:09:39 | [全部帖] [楼主帖] 3  楼

学习了,谢谢啦



赞(0)    操作        顶端 
你是哈哈哈
注册用户
等级:上等兵
经验:134
发帖:0
精华:0
注册:2016-3-23
状态:离线
发送短消息息给你是哈哈哈 加好友    发送短消息息给你是哈哈哈 发消息
发表于: IP:您无权察看 2016-3-29 8:52:03 | [全部帖] [楼主帖] 4  楼

ok



赞(0)    操作        顶端 
太阳公公
注册用户
等级:下士
经验:177
发帖:0
精华:0
注册:2016-2-14
状态:离线
发送短消息息给太阳公公 加好友    发送短消息息给太阳公公 发消息
发表于: IP:您无权察看 2016-3-29 19:20:55 | [全部帖] [楼主帖] 5  楼

ok



赞(0)    操作        顶端 
总帖数
5
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论