专栏首页Python小屋Python函数默认值参数的2个坑

Python函数默认值参数的2个坑

在定义函数时,Python支持默认值参数,在定义函数时可以为形参设置默认值。在调用带有默认值参数的函数时,可以不用为设置了默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,当然也可以通过显式赋值来替换其默认值。也就是说,在调用函数时是否为默认值参数传递实参是可选的,具有较大的灵活性。例如:

>>> def say( message, times =1 ): print((message+' ') * times)

>>> say('hello') hello >>> say('hello', 3) hello hello hello

好了,下面重点介绍默认值参数的坑,虽然说是两个坑,但实际上是一个意思。

(1)默认值参数的值是在函数定义时确定的

>>> i = 3 >>> def f(n=i): #参数n的值仅取决于i的当前值 print(n) >>> f() 3 >>> i = 5 #函数定义后修改i的值不影响参数n的默认值 >>> f() 3 >>> i = 7 >>> f() 3 >>> def f(n=i): #重新定义函数 print(n) >>> f() 7

(2)默认值参数只初始化一次

如果参数的默认值是数字、字符串、元组或其他不可变类型的数据,并不会有什么影响,但是如果参数的默认值是列表、字典、集合等可变类型数据的话,这里有个大坑。

>>> def demo(newitem, old_list=[]): old_list.append(newitem) return old_list

>>> print(demo('5', [1, 2, 3, 4])) [1, 2, 3, 4, '5'] >>> print(demo('aaa', ['a', 'b'])) ['a', 'b', 'aaa'] >>> print(demo('a')) ['a'] >>> print(demo('b')) #注意这里的输出结果 ['a', 'b']

如果想得到正确结果,建议把函数写成下面的样子:

def demo(newitem, old_list=None): if old_list is None: old_list = [] old_list.append(newitem) return old_list

本文分享自微信公众号 - Python小屋(Python_xiaowu),作者:董付国

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微课|Python程序设计开发宝典(5.2.2):默认值参数

    调用带默认值参数的函数时,有三个要点:1)是否给带默认值的参数传递了实参,2)参数的默认值是否为可变对象,3)在函数内部是如何使用默认值参数的。

    Python小屋屋主
  • 常用正则表达式锦集与Python中正则表达式的用法

    1、常用正则表达式 最简单的正则表达式是普通字符串,只能匹配自身 '[pjc]ython'可以匹配'python'、'jython'、'cython' '[a-...

    Python小屋屋主
  • 使用Python编写一个聪明的尼姆游戏

    关于尼姆游戏的介绍请参考上一篇文章:一个傻傻的尼姆游戏及其Python实现,本文使用Python实现一个聪明的尼姆游戏。 在聪明模式中,计算机每次拿走足够多的物...

    Python小屋屋主
  • 开发实时联网对战的微信小游戏

    极乐君
  • [jio本]Debian9一键安装各种下载工具

    这个脚本是我写来自用的,主要是为了偷懒。。。每次安装都手动麻烦的一批,搞个脚本一劳永逸~

    砸漏
  • 提高你的被动收入

    工作前几年,相信不少程序员朋友都会沉浸在提升自我技能,获取更大职业进步的目标中,这样想这样做都没有错,但不应该忽略了职业之外的成长,这两种成长都是需要的,不可偏...

    歪脖贰点零
  • Golang实现一个微信抽奖小程序后台

    ​之前在学区块链,然后看到很多区块链项目都是基于golang在开发,包括以太坊的官方go-ethereum。了解了下go是google出品,很多人说其有c/c+...

    J_J
  • 小猿看企业丨猎豹已成为一家大数据公司了

    北京时间11月17日,猎豹移动公布了截止2015年9月30日的第三季度财报。 财报显示,Q3猎豹移动总收入为10.09亿元,同比增长110.7%;移动收入为7....

    数据猿
  • 链表问题

    A stringSof lowercase letters is given. We want to partition this string into as...

    大学里的混子
  • Spark会把数据都载入到内存么?

    很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解。

    用户2936994

扫码关注云+社区

领取腾讯云代金券