QQ登录

只需一步,快速开始

搜索
鱼C论坛笔记大赛成绩公示
查看: 47|回复: 7

[已解决]关于函数默认参数疑问

[复制链接]
最佳答案
0 

尚未签到

发表于 2017-8-26 08:06:23 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 八千年 于 2017-8-26 08:32 编辑

函数代码如下:
  1. def add_end(L=[]):
  2.     L.append('END')
  3.     return L
复制代码


当你使用默认参数调用时,一开始结果是对的:
  1. >>> add_end()
  2. ['END']
复制代码


但是,再次调用add_end()时,结果就不对了:
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

疑问:
为什么正常调用的时候,多次调用不会出现多个'END'?
>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']
最佳答案
2017-8-26 08:49:47
八千年 发表于 2017-8-26 08:45
sorry,是我问的方式有问题,使用默认参数调用这个函数时,默认参数都会发生变化。原理是不是这样:
第 ...

因为不是默认,不会修改默认值
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
205 
累计签到:205 天
连续签到:42 天
发表于 2017-8-26 08:14:32 | 显示全部楼层
第一次默认以后,真正的默认参数就多了END,在默认,又多一个END
所以Python不要这样,最好设置一个参数None,然后操作
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 

尚未签到

 楼主| 发表于 2017-8-26 08:18:12 | 显示全部楼层
新手·ing 发表于 2017-8-26 08:14
第一次默认以后,真正的默认参数就多了END,在默认,又多一个END
所以Python不要这样,最好设置一个参数No ...

使用这个函数:
  1. def add_end(L=[]):
  2.     L.append('END')
  3.     return L
复制代码

怎么不会出现调用一次多一个END的情况呢?
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
205 
累计签到:205 天
连续签到:42 天
发表于 2017-8-26 08:25:18 | 显示全部楼层
  1. >>> add_end()
  2. ['END']
  3. >>> add_end()
  4. ['END', 'END']
  5. >>> add_end()
  6. ['END', 'END', 'END']
  7. >>> add_end()
  8. ['END', 'END', 'END', 'END']
  9. >>> add_end()
  10. ['END', 'END', 'END', 'END', 'END']
  11. >>> add_end()
  12. ['END', 'END', 'END', 'END', 'END', 'END']
  13. >>> add_end()
  14. ['END', 'END', 'END', 'END', 'END', 'END', 'END']
复制代码
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 

尚未签到

 楼主| 发表于 2017-8-26 08:45:29 | 显示全部楼层

sorry,是我问的方式有问题,使用默认参数调用这个函数时,默认参数都会发生变化。原理是不是这样:
第一次调用该函数时:变量L的值变成了['END'];
第二次调用该函数时:变量L的值变成了['END','END'];
以此类推
因为L是变量,会随着内容改变而改变。

我想知道的是:为什么正常多次调用的时候,L这个变量怎么不出现随着内容改变而改变?
  1. >>> add_end([1, 2, 3])
  2. [1, 2, 3, 'END']
  3. >>> add_end([1, 2, 3])
  4. [1, 2, 3, 'END']
复制代码

按照上面使用默认L为参数时,多次调用L改变的原理,是不是应该这样:
第一次调用时,L的值为[1, 2, 3, 'END']
第二次调用时,L的值为[1, 2, 3, 'END',1, 2, 3, 'END']
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
205 
累计签到:205 天
连续签到:42 天
发表于 2017-8-26 08:49:47 | 显示全部楼层    本楼为最佳答案   
八千年 发表于 2017-8-26 08:45
sorry,是我问的方式有问题,使用默认参数调用这个函数时,默认参数都会发生变化。原理是不是这样:
第 ...

因为不是默认,不会修改默认值
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
0 

尚未签到

 楼主| 发表于 2017-8-26 08:52:15 | 显示全部楼层
新手·ing 发表于 2017-8-26 08:49
因为不是默认,不会修改默认值

谢谢版主同学!
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
最佳答案
205 
累计签到:205 天
连续签到:42 天
发表于 2017-8-26 08:53:05 | 显示全部楼层
1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-9-25 10:44 Powered by Discuz! X2.5 Theme by dreambred

快速回复 返回顶部 返回列表