python3教程:默认参数为列表

定义一个函数,传入一个list,添加一个end再返回

def  add_end(L=[]):
    L.append('END')
    return L

正常调用时,结果似乎是好的

[En]

When called normally, the result seems to be good

print  (add_end([1,2,3]))  #[1, 2, 3, 'END']

使用默认参数调用时,初始结果也是正确的,但再次调用时,结果不正确

[En]

When called with the default parameter, the initial result is also correct, but when it is called again, the result is not correct

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
print (add_end())   #['END']

print (add_end())    #['END', 'END']

print  (add_end())    #['END', 'END', 'END']

从上述调用结果发现,函数每次都记住了上次添加了’END’后的list,python函数在定义的时候,默认参数L的值就被计算出来了即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变 了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了

因此,在定义缺省参数时要记住一件事:缺省参数必须指向不可变对象

[En]

So, one thing to keep in mind when defining default parameters: default parameters must point to immutable objects

修改上面的例子,可以用None这个不变对象来实现

def  add_end2(L=None):
    if L is None:
        L=[]
    L.append('END')
    return  L

无论调用多少次都没问题

print (add_end2())
print  (add_end2())
print  (add_end2())
#['END']
#['END']
#['END']

一旦创建了不可变对象,对象内部的数据就不能被修改,从而减少了因修改数据而导致的错误。此外,由于对象是不变的,所以在多任务环境下不需要锁定对象同时读取,完全没有问题。当我们编写程序时,如果我们可以设计一个不可变的对象,我们应该试着把它设计成一个不可变的对象。

[En]

Once an immutable object is created, the data inside the object cannot be modified, thus reducing errors caused by modifying the data. In addition, because the object is unchanged, there is no need to lock the object to read at the same time in the multitasking environment, and there is no problem at all. When we write a program, if we can design an immutable object, we should try to design it as an immutable object.

不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)
可变(mutable):字典型(dictionary)、列表型(list)

Original: https://www.cnblogs.com/python1111/p/16478115.html
Author: 小小程序员ol
Title: python3教程:默认参数为列表

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499063/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球