首页
学习
活动
专区
工具
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函数默认值参数的2个坑

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

    1.3K60

    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 函数编程的形参、实参、位置参数、默认参数、关键字参数以及函数的递归 可变参数: #可变参数* 代表将参数处理成列表 #可变参数** 代表将参数处理成字典,

    1K20

    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函数参数之必传参数、默认参数、可变参数、关键字参数的详细使用

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

    51420

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

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

    1.6K00

    小心此坑: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/ 如何避免?...最好的方式是不要使用可变对象作为函数默认值。

    1.1K10

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

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

    27500

    为什么说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) 从上面的运行结果,我们可以看出: 如果在函数的定义中,参数默认值使用可变类型,那么可变类型会在函数定义的时候就进行创建,如果使用不当的话,可能得到的效果与我们的预期不一致

    19230

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

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

    42650

    Why Not Python?

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

    81380

    C++11 lambda

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

    1.1K30

    函数式编程入门教程

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

    1.2K20
    领券