首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python函数上的默认参数并不总是有效

Python函数上的默认参数并不总是有效。默认参数是在函数定义时给参数赋予的一个默认值,当调用函数时如果没有传入对应的参数,则会使用默认值。然而,当默认参数是可变对象(如列表、字典等)时,会出现一些意想不到的结果。

这是因为在Python中,默认参数在函数定义时只会被创建一次,并且会在每次调用函数时重复使用。如果默认参数是可变对象,那么每次函数调用时对该对象的修改都会被保留下来,导致下一次函数调用时默认参数的值已经被修改。

为了解决这个问题,可以将默认参数设置为不可变对象,例如字符串或者None。如果需要使用可变对象作为默认参数,可以在函数内部进行处理,例如在函数内部创建一个新的可变对象。

下面是一个示例:

代码语言:txt
复制
def append_item(item, lst=[]):
    lst.append(item)
    return lst

print(append_item(1))  # 输出 [1]
print(append_item(2))  # 输出 [1, 2]
print(append_item(3))  # 输出 [1, 2, 3]

在上面的示例中,函数append_item有一个默认参数lst,它是一个可变的列表。当我们连续调用append_item函数时,每次调用都会修改默认参数lst,导致结果不符合预期。

为了避免这个问题,可以将函数修改如下:

代码语言:txt
复制
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]
print(append_item(3))  # 输出 [3]

在修改后的函数中,我们将默认参数lst设置为None,并在函数内部进行处理。如果传入的参数lst为None,则创建一个新的空列表,否则使用传入的列表。这样每次调用函数时都会使用一个新的列表,避免了默认参数被修改的问题。

总结起来,Python函数上的默认参数并不总是有效,特别是当默认参数是可变对象时。为了避免出现意想不到的结果,可以将默认参数设置为不可变对象,或者在函数内部进行处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python默认参数详解

文章主题 不要使用可变对象作为函数默认参数例如 list,dict,因为def是一个可执行语句,只有def执行时候才会计算默认默认参数值,所以使用默认参数会造成函数执行时候一直在使用同一个对象...如果有任何问题请发邮件到 acmerfight圈gmail.com,感激不尽 主要参考资料 书籍:《深入Python编程》 大牛:shell 和 Topsky Python对于函数中默认参数处理往往会给新手造成困扰...这么使用引起变化,非常“sticky”。 为什么会发生这种情况? 当且仅当默认参数所在“def”语句执行时候,默认参数才会进行计算。...这是如何工作? 当Python执行一条def语句时, 它会使用已经准备好东西(包括函数代码对象和函数上下文属性),创建了一个新函数对象。同时,计算了函数默认参数值。...另一个重置默认参数方法是重新执行相同def语句,Python将会和代码对象创建一个新函数对象,并计算默认参数,并且把新创建函数对象赋值给了和上次相同变量。

1.4K10

Python参数默认值陷阱!

今日分享 参数默认值陷阱 下面定义函数f,其参数d是一个默认参数,且为字典类型: def f(a,d={}): print(f'a: {a}') print(f'd: {d}') # do...some process return d 最后返回字典d,下面调用函数f: ret_dict = f(1) # 第二个参数d使用默认值 ret_dict['b'] = 2 ret_dict[...'c'] = 3 再次使用函数f: f(1) 尽管第二个参数默认参数,按照预期它应该返回一个空字典,但结果却是如下: a: 1 d: {'b': 2, 'c': 3} 因此默认参数:如果是列表,...不要设置为[];如果是字典,不要设置为{} 应该将它们默认值设置为None def f(a,d=None): if d is None: d = {} ### 初始化为空字典 print...(f'a: {a}') print(f'd: {d}') # do some process return d ret_dict = f(1) # 第二个参数d使用默认值 ### 结果:

1.7K20

Python教程如何设置函数默认参数

今天马哥教育要跟大家分享文章是Python教程如何设置函数默认参数?上一讲我们结束了用文件保存游戏Python内容,这一讲我们来补充一个小技巧,关于设置函数默认参数哦!...那么,我们就可以给这个函数一个默认参数: def hello(name = 'world'): print 'hello ' + name 当你没有提供参数值时,这个参数就会使用默认值;如果你提供了,就用你给...这样,在默认情况下,你只要调用 hello() 就可以输出 hello world 同样你也可以指定参数: hello('python') 输出 hello python 注意,当函数有多个参数时,如果你想给部分参数提供默认参数...,那么这些参数必须在参数末尾。...以上就是马哥教育今天为大家分享关于Python教程如何设置函数默认参数文章,希望本篇文章能够对正在 python学习 和从事python相关工作小伙伴们有所帮助,想要了解更多相关知识记得关注马哥教育官网

1.9K10

python 函数编程位置参数默认参数、关键字参数以及函数递归

usr/bin/env python _*_ coding:utf-8 _*_ def AQA(INPUT): if INPUT=='hello world': #在输入正确情况下...世界') return 'right' else: print('世界毁灭了') return 'wrong' #如果retrun放在世界毁灭前面则不会执行...def hello_again(): print('大不了从头再来') if __name__=='__main__': INPUT=input('\033[1;31;40m请输入您问好语...** 其次关于位置参数与关键参数设置: ** 注意关键参数是转化为dict(key对应value),位置参数是元组形式 #函数式变成 def fun(start,end='2017',where...其他方面可以参考博客: python 函数编程形参、实参、位置参数默认参数、关键字参数以及函数递归 可变参数: #可变参数* 代表将参数处理成列表 #可变参数** 代表将参数处理成字典,

98520

python 函数编程位置参数默认参数、关键字参数以及函数递归

usr/bin/env python _*_ coding:utf-8 _*_ def AQA(INPUT): if INPUT=='hello world': #在输入正确情况下...世界') return 'right' else: print('世界毁灭了') return 'wrong' #如果retrun放在世界毁灭前面则不会执行...def hello_again(): print('大不了从头再来') if __name__=='__main__': INPUT=input('\033[1;31;40m请输入您问好语...** 其次关于位置参数与关键参数设置: ** 注意关键参数是转化为dict(key对应value),位置参数是元组形式 #函数式变成 def fun(start,end='2017',where...其他方面可以参考博客: python 函数编程形参、实参、位置参数默认参数、关键字参数以及函数递归 可变参数: #可变参数* 代表将参数处理成列表 #可变参数** 代表将参数处理成字典,

1.2K50

Python函数默认参数2个坑

在定义函数时,Python支持默认参数,在定义函数时可以为形参设置默认值。...在调用带有默认参数函数时,可以不用为设置了默认形参进行传值,此时函数将会直接使用函数定义时设置默认值,当然也可以通过显式赋值来替换其默认值。...也就是说,在调用函数时是否为默认参数传递实参是可选,具有较大灵活性。...i值不影响参数n默认值 >>> f() 3 >>> i = 7 >>> f() 3 >>> def f(n=i): #重新定义函数 print(n) >>> f() 7 (2)默认参数只初始化一次...如果参数默认值是数字、字符串、元组或其他不可变类型数据,并不会有什么影响,但是如果参数默认值是列表、字典、集合等可变类型数据的话,这里有个大坑。

1.2K60

软件测试|Python函数参数之必传参数默认参数、可变参数、关键字参数详细使用

图片在Python中,函数参数是定义在函数头部变量,用于接收传递给函数数据。Python函数参数有四种类型:必传参数默认参数、可变参数和关键字参数。每种类型都有不同使用方式和适用场景。...Python函数参数类型必传参数:最常用,必传确定数量参数默认参数:在调用函数时可以传也可以不传,如果不传将使用默认值可变参数:可变长度参数关键字参数:长度可变,但是需要以 key-value 形式传参必传参数必传参数是指在调用函数时必须提供参数...注:声明函数时,当同时存在必传参数默认参数,形参顺序必须是 (必传参数 , 默认参数),不能默认参数在前可变参数可变参数是指在函数定义时不确定参数个数情况下,可以接收任意数量参数。...Python提供了两种方式来实现可变参数:使用星号(*)和双星号(**)。...总结Python函数参数有四种类型:必传参数默认参数、可变参数和关键字参数

37520

Python 函数中使用默认参数 — 谈谈可变对象坑?!

参考链接: Python函数中默认参数python 中定义函数,其参数可以使用多种不同方式,其中包括 “默认参数”类型,那么当作默认对象有什么限制和要求么?这里搞不好还真有坑!...参数默认值:  使用可变对象使用不可变对象 默认参数使用可变对象会怎样?  先复原需求  定义一个函数,为传入列表(list)尾部添加一个“end”元素。 ...3. print(addend(lst))  当调用函数并传入实参(lst)时候,并不是把lst列表中内容拷贝到lt列表中,而是使lt指向对象发生了改变,使lt也指向了lst指向空间,这样,lt...,函数定义处依旧使用默认参数形式,但是其默认参数值不是一个空列表了,而是有数据元素列表([1,2])。 ...该检查检测何时在参数默认值中检测到列表或字典等可变值。默认参数值只在函数定义时计算一次,这意味着修改参数默认值将影响函数所有后续调用。  如果函数默认参数使用不可变对象又会怎样呢?

1.5K00

小心此坑:Python 函数参数默认值是可变对象

看到了有给 Python 函数参数默认值传递可变对象,以此来加快斐波那契函数递归速度,代码如下: def fib(n, cache={0: 0, 1: 1}): if n not in cache...函数也是对象,参数默认值就是对象属性,在编译阶段参数默认值就已经绑定到该函数,如果是可变对象,Python 函数参数默认值在会被存储,并被所有的调用者共享,也就是说,一个函数参数默认值如果是一个可变对象...id 是一样,说明它们用到是 li 是同一个,这就参数默认值是可变对象逻辑,对于所有的调用者来讲,是共享。...如果要深入研究 Python 为什么这么设计,可以移步 http://cenalulu.github.io/python/default-mutable-arguments/ 如何避免?...最好方式是不要使用可变对象作为函数默认值。

1K10

有趣 Python 特性 3 | 当心「默认可变参数」这个大猪蹄子。

明明我们函数里明明对默认可变参数赋值了,为什么第 1 次调用是初始化状态,第 2 次,第 3 次出现结果就不是我们想要了呢?...其实出现这样结果是因为 Python 中函数默认可变参数并不是每次调用该函数时都会初始化。相反,它们会使用最近分配值作为默认值。...在上述 test_func([]) 结果不同是因为,当我们将明确 [] 作为参数传递给 test_func() 时候,就不会使用 test_func 默认值,所以函数返回是我们期望值。...在自定义函数特殊属性中,有个「 __defaults__」 会以元组形式返回函数默认参数。...这个也很简单,就是将 None 指定为参数默认值,然后检查是否有值传给对应参数

26400

为什么说python里面函数参数默认值最好不要使用可变类型

之前发布过Python中函数介绍:Python中函数介绍 ,今天来做一个小小补充说明:为什么说python里面函数参数默认值最好不要使用可变类型 Python中,函数参数默认值是在函数定义时计算...当默认值是可变类型(如列表、字典等)时,这个默认值在函数定义时就会被创建并分配给参数。当函数被调用时,如果没有显式地传递该参数,函数将使用该默认值。...可变类型默认值在函数定义时只会被创建一次,然后会在后续函数调用中重复使用。这意味着,如果在函数中修改了这个默认值,它将在后续函数调用中保持修改后值,而不是返回最初默认值。...接下来我们通过一个例子演示一下: def add(a:int,b:list=[]): # 定义函数时候就创建了列表 print(id(b)) b.append(a) print...(b) add(1) add(2) add(3) 从上面的运行结果,我们可以看出: 如果在函数定义中,参数默认值使用可变类型,那么可变类型会在函数定义时候就进行创建,如果使用不当的话,可能得到效果与我们预期不一致

15730

一日一技:为什么年代久远 Python 项目里面那么多默认参数

摄影:产品经理 蜡烛上面的跑马灯 在写 Python 代码时候,大家可能会在不知不觉中使用一些设计范式。我们来看两个例子。...self): print('我在学习') def eat(self): print('我在吃东西') 在初始化People类时,需要传入一个address参数...于是ClassRoom、Restaurant、Ballroom这三个类构造函数都要随之做修改,全都得加上这个address参数。 这就叫做牵一发而动全身。...很多人为了避免做这样修改,会把新增加这个参数address改成默认参数: class People: def __init__(self, name, age, sex, address='...这就是为什么你们公司代码里面,很多函数会带上大量奇奇怪怪默认参数原因。 ” 在编程范式中,有一个术语叫做依赖注入,就是为了解决这个问题

40650

Why Not Python

除此之外,人们总是喜欢熟悉事物,对于新事物总是抱持著一份怀疑心态,对于Python这样一款没听过语言,我一开始也是抱持著半信半疑态度,而如果因此而不去学的话,是我自己损失,我后悔没有早点学Python...丰富标准式库 这也是Python好处之一,光是内建标准式库,就可做大部份你想做事。...,还有相当多使用Python成功实例,因此 Python并不只是夸大,而是真的非常强大与易用。 ?...Python也可以嵌在其它程式裡面,这样特性让 Python非常有弹性,C++一个第三方式库(正在蕴酿成为标准式库),里面就有可以让Python和C++轻鬆结合式库。...深思熟虑设计哲学 Python并不盲从其它语言一些惯例,Python自身有一套经过深思熟虑后设计哲学,在很多地方你都可以看见Python它被如此设计背后道理,最有名例子就是Zen

78680

C++11 lambda

在本文中,我们将研究lambda与纯函数和子类(实现类)在实现方面的区别operator()。...functor几乎相同:它们都分配存储捕获值对象,并获取指向该对象隐藏函数参数。...总结主要区别: 1、子和lambda总是传递一个this指针,而普通函数自然不是。这会消耗一个额外寄存器和8个字节堆栈空间。 Lambda“构造函数”被内联到创建Lambda函数中。...这显着减少了执行复制量(lambda2条指令,5条指令),以及避免了函数调用建立和拆卸。...闭包 利用函数对象记住状态数据 虽然函数对象也可以像函数一样被用来表达一个数据处理过程,但它更大意义在于,函数对象具有“记忆力”,它可以记住函数执行过程中状态数据,从而使它可以应用在那些需要记住函数上次执行状态数据场景下

1.1K30

函数式编程入门教程

所谓"柯里化",就是把一个多参数函数,转化为单参数函数。 ? 有了柯里化以后,我们就能做到,所有函数只接受一个参数。后文内容除非另有说明,都默认函数只有一个参数,就是所要处理那个值。...通过这种方式,Either 子表达了条件运算。 Either 常见用途是提供默认值。下面是一个例子。 ? 上面代码中,如果用户没有提供地址,Either 子就会使用左值默认地址。...Monad 作用是,总是返回一个单层子。...上面代码中,如果函数f返回是一个子,那么this.map(f)就会生成一个嵌套子。所以,join方法保证了flatMap方法总是返回一个单层子。...上面代码中,读取文件和打印本身都是不纯操作,但是readFile和print却是纯函数,因为它们总是返回 IO 子。

1.1K20
领券