Python之在函数中使用列表作为默认参数

??本文将介绍笔者在工作中遇到的Python的一个坑,那就是使用列表作为默认参数。

??我们知道,在Python中,列表(list)是可变对象,所以列表的内容可能会在函数内改变。另一个需要注意的是,使用列表作为函数的默认参数时,列表的内容变化情况。

??首先,我们看以下的代码例子:

def add(x, lst=[]):
    if x not in lst:
        lst.append(x)

    return lst

def main():
    list1 = add(1)
    print(list1)

    list2 = add(2)
    print(list2)

    list3 = add(3, [11, 12, 13, 14])
    print(list3)

    list4 = add(4)
    print(list4)

main()

你可能以为输出的结果会是:

[1]
[2]
[11, 12, 13, 14, 3]
[4]

但事实上,该程序输出的结果是:

[1]
[1, 2]
[11, 12, 13, 14, 3]
[1, 2, 4]

这是为什么呢?函数add的功能是当x不在列表中时,将x追加给列表lst。当函数第一次执行时,参数lst的默认值[]被创建。这个默认值只会被创建一次。add(1)将1加到lst。当函数再次被调用时,lst是[1]而不是[],因为lst只被创建一次。当参数的lst为[11,12,13,14]时,lst就是[11,12,13,14]。list4调用函数时,使用默认参数,因此,现在默认参数lst为[1,2]。

??为了更好地理解调用情况,可以在add函数中输出lst的id,如以下代码:

def add(x, lst=[]):
    print(id(lst))

    if x not in lst:
        lst.append(x)

    return lst

def main():
    list1 = add(1)
    print(list1)

    list2 = add(2)
    print(list2)

    list3 = add(3, [11, 12, 13, 14])
    print(list3)

    list4 = add(4)
    print(list4)

main()

输出结果如下:

4469603648
[1]
4469603648
[1, 2]
4469670472
[11, 12, 13, 14, 3]
4469603648
[1, 2, 4]

可以看到,list1, list2, list4调用时默认参数的id并没有发生改变,而list3的id发生了改变。

??这是Python使用列表作为默认参数的一个坑。那么,如何避免踩坑呢?如果想要使用默认列表在每次函数调用时都是[],可以像下面的程序那样修改函数参数:

def add(x, lst=None):

    if lst is None:
        lst = []
    if x not in lst:
        lst.append(x)

    return lst

def main():
    list1 = add(1)
    print(list1)

    list2 = add(2)
    print(list2)

    list3 = add(3, [11, 12, 13, 14])
    print(list3)

    list4 = add(4)
    print(list4)

main()

输出的结果如下:

[1]
[2]
[11, 12, 13, 14, 3]
[4]

本次分享到此结束,感谢阅读~

注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

原文地址:https://www.cnblogs.com/jclian91/p/10325849.html

时间: 2024-08-08 20:00:15

Python之在函数中使用列表作为默认参数的相关文章

Python函数中的必选/默认/可变/关键字/命名参数

Python函数中的必选/默认/可变/关键字/命名参数 一.默认参数 def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s n为默认参数,直接赋值 默认参数设置的两个注意事项: 1.必选参数在前,默认参数在后,否则会报错 2.当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面.变化小的参数就可以作为默认参数. 二.可变参数 在python中,如果我们需要传入不确定数目的参数,就可以利用可变参数 def ca

在函数中申请内存,使用参数传递方式将此内存的首地址传给实参

要求:将一个指针p传入一个函数f,f的一个参数p1接收此指针,用p1申请p所属类的内存(new),要求亦指向此申请的内存首地址传. 比较下面两段代码,问哪一个能完成任务?为什么? (1) using namespace std; class Matrix{ public: Matrix(){m_RowCount = 0;}; int getRowCount(){return m_RowCount;}; private: int m_RowCount; }; void f1(Matrix *pM)

函数传参时,默认参数为变量容易出现的问题

在定义函数时使用默认参数的时候,如果默认参数是变量的话,需要注意一下坑. 1 # This Python file uses the following encoding: utf-8 2 3 def add_end(l = []): 4 l.append('end') 5 print(id(l), l) 6 7 if __name__ == '__main__': 8 add_end() 9 add_end() 10 11 输出: 12 2510338155080 ['end'] 13 251

python之enumerate函数:获取列表中每个元素的索引和值

源码举例: 1 def enumerate_fn(): 2 ''' 3 enumerate函数:获取每个元素的索引和值 4 :return:打印每个元素的索引和值 5 ''' 6 list = ['Mike', 'male', '24'] 7 for index, value in enumerate(list): 8 print("索引:" + str(index), ", 值:" + value) 9 10 11 enumerate_fn() 运行结果: 索引:

python内置函数中的 IO文件系列 open和os

本篇介绍 IO 中的 open 和 os基础用法. 本次用一个游戏登陆 基础界面做引子,来介绍. 实现存储的话,方式是很多的. 比如 存到字典 和列表了,可是字典.列表是临时的,玩网页游戏一次还是可以,如果要是一个反复要用到的一个软件的话,显然就不合适了,比较熟悉的介质有<文件>,对正在的程序来讲,用文件数存储据存到文件当中不是很好的选择.这里有数据库的概念. 本次用文件来存储. 本次内容实现 登陆 验证 登陆验证 形式,必须输入正确的用户名和密码,才可以登陆 一共验证三次.成功即运行程序 

python中类的函数中的self

Python类中的self到底是干啥的 Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的概念,似乎有点弄明白了. 首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的.self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数. self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗(为了和其他编

python内置函数中的zip,max,min函数例子

一:zip函数 print(list(zip(('a','b','c'),('1','2','3')))) print(list(zip(('a','b'),('1','2','3')))) print(list(zip(('a','b','c'),('1','2')))) p={'name':'jake','age':'20'} print(list(zip(p.keys(),p.values()))) print(list(zip(['a','b'],'sdfghh'))) 输出为:[('a

Python学习笔记#函数中使用文档,让你的函数更容易理解

>>> def intadd(a,b): 'this is a test of the doc of function' return a+b >>> intadd(2,3) 5 >>> intadd.__doc__ 'this is a test of the doc of function' >>>

函数 7、位置参数与默认参数之间的关系

默认参数只能放在位置参数后,如果放在位置参数前就会报错 def my_max(a,b=5,c=20): # a为位置参数,b为默认参数 if a>b: return a else: return b i=my_max(10) print(i) #加一个c,如果c不赋值那就只能放在b默认参数前 #如果赋值,就可以放在b后 因为c成了默认参数 def my_max(a,b=15,c=20): if a>b>c: return a elif b>a>c: return b else