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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python 中,函数默认值参数是指在定义函数,可以为参数设置一个默认值,在函数调用如果没有传入该参数,则会使用默认值函数默认值参数的语法格式如下: ``` def function_name(parameter1=default_value1, parameter2=default_value2, ...): # function code ``` 在上面的代码中,当我们调用函数,可以不传递参数,此函数会使用默认值,例如: ``` def greet(name="world"): print("Hello, {}!".format(name)) greet() # 输出: Hello, world! greet("John") # 输出: Hello, John! ``` 在上面的例子中,函数 greet() 定义了一个名为 name 的参数,并且为其设置了默认值 "world"。当我们在调用 greet() 函数,如果不传递参数,则使用默认值 "world";如果传递了参数,则使用传递的参数。 需要注意的是,如果函数默认值参数是可变的对象(如列表、字典等),那么在函数内部修改该对象的,会影响到所有调用该函数未传递该参数的地方。例如: ``` def append_item(item, lst=[]): lst.append(item) return lst print(append_item(1)) # 输出: [1] print(append_item(2)) # 输出: [1, 2] ``` 在上面的例子中,函数 append_item() 定义了一个名为 lst 的参数,并且为其设置了默认值 []。当我们在第一次调用 append_item() 函数,该函数会创建一个空列表,并将其作为默认值。然后,该函数会向该列表中添加一个元素 1,并返回该列表 [1]。在第二次调用 append_item() 函数,由于 lst 参数默认值已经被创建,因此该函数会使用第一次调用创建的列表 [1]。然后,该函数会向该列表中添加一个元素 2,并返回该列表 [1, 2]。 因此,为了避免这种情况,我们可以将默认值设置为 None,并在函数内部判断参数是否为 None,如果是,则创建一个新的可变对象。例如: ``` def append_item(item, lst=None): if lst is None: lst = [] lst.append(item) return lst print(append_item(1)) # 输出: [1] print(append_item(2)) # 输出: [2] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dongfuguo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值