python之函数参数问题(参数为可变对象)
今天看到一段代码,其中函数入参有一个参数为list,类似如下:
def linux_monitor(pid=0,pidlist = []):
pidlist.append(pid)
通过测试发现是有问题的,在其中加入print和调用即可发现(使用默认参数值调用俩次):
def linux_monitor(pid=0,pidlist = []):
pidlist.append(pid)
print(pid)
print(pidlist) linux_monitor()
linux_monitor()
结果如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH0AAABQCAYAAAA0snrNAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJeSURBVHhe7dyxjilhHIbxP5VGq3EFKGjVGglKwlVoXBQXIGqVRidxAW5AQSJE4qzJbHJyPoePnRj7vc+v2Vlks/GEzM6+u5nLF4OUbPwRQoguiOiCiC6I6IKILsiJfjqdbDQaWaFQsOFwaMfjMb4HoXCiTyYTq9VqttlsrNPp2Hg8ju9BKG5Gb7fblsvlrF6vEz1ATvTVamX5fD46voZfr9fRMcLx8EQum334EPwyTtFyuWy73S46PhwOVqlUomOEw4k+GAxsNptFZ+2LxcJ6vV58D0LhRO/3+7ZcLq1YLNp0Oo0+R1j41aogztIEEV0Q0QURXRDRBRFdENEFEV0Q0QX994pcJpOJj8weXbR75rFI391X+jXgd8R7M6q/H4fP5/32zowqHE9FZ0YVBu/ozKjC8fLZOzOq38u7HDOqcHhHZ0YVDu/ozKjCwcUZQWzkBHEKLojogoguiOiCiC6I6IKILojogoguyInOf5cKnxOdWVT4bkZnFhU2JzqzqPA9PJFjFhUepyizqPA50ZlFhc+JziwqfCxnBHGWJojogoguiOiCiC6I6IKILojogoguKJE/YEwKfwj5Hndf6dcn/vvJT2pGxX+pSp/323tSMyrmWB/g65V10793tVqty3a7jY73+/2l2WxGx8/y+Tp3vi0kwPuVntSMijlW+l4+e09qRsUc6/28n/GkZlTMsdLnHT2pGRVzrPR5R783o+p2u/HRY8yx0vfjizPn89kajYbN5/P4ltdxceY9fryRu/6cXa1WrVQqxbfg0zGMFMTPS4KILojogoguiOhyzP4AMb44AOFrRHsAAAAASUVORK5CYII=" alt="" />
第二次调用的时候,pidlist并不是空的
所以对于可变参数,特别需要注意,如列表等都可能产生这样的问题
我们可以对代码做如下处理即可正常使用:
def linux_monitor(pid=0,pidlist = None):
if pidlist == None:
pidlist = []
pidlist.append(pid)
print(pid)
print(pidlist)
大家可以试一下
python之函数参数问题(参数为可变对象)的更多相关文章
- python定义函数时默认参数注意事项
如果在调用一个函数时,没有传递默认参数,则函数内的默认参数是对函数的默认参数属性__defaults__的引用, 如 def func(arg1=[]): arg1.append(2) 调用func时 ...
- Python 中函数的 收集参数 机制
定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...
- Python的函数名作为参数传入调用以及map、reduce、filter
零.python的lambda函数: #lambda function func = lambda x : x+1 #这里是一个匿名函数,x是参数,x+1是对参数的操作 func(1)= 2 多个参数 ...
- Python虚拟机函数机制之参数类别(三)
参数类别 我们在Python虚拟机函数机制之无参调用(一)和Python虚拟机函数机制之名字空间(二)这两个章节中,分别PyFunctionObject对象和函数执行时的名字空间.本章,我们来剖析一下 ...
- python定义函数时的参数&调用函数时的传参
一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...
- 【python】-- 函数非固定参数,返回值(return)
函数非固定参数 1.默认参数: 代码如下: def information_register(name,age,country,sex): print("----注册信息------&quo ...
- python笔记四(dict/set/不可变对象)
一.dict 字典是包含key_value存储方式.在放进去的时候,必须根据key值Hash出value的存放位置,这样,取的时候才能根据key直接拿到value. dict的操作: d = {'Mi ...
- python之函数形参、实参、可变长参数整体使用和分类
形参与实参 '''def fn(形参们): pass fn(实参们)'''# 形参:定义函数,在括号内声明的变量名,用来结束外界传来的值# 实参:调用函数,在括号内传入的实际值,值可以为常量.变量.表 ...
- python默认参数不能定义为可变对象类型
python的默认参数只会在函数定义时被确定,而不是每次调用时重新确定,所以,一旦在函数中修改了默认参数,则在随后的调用中都会生效 由于这个特性,在定义函数时,如果默认参数使用可变的对象类型,如空列表 ...
- python中函数的默认参数陷阱问题
其实也不能说是陷阱,只是一个不容易注意到的地方,尤其是有其他java/c++类编程语言经验的人员,这里涉及到python的一个特点,所以笔者说是陷阱只是一个噱头而已. def test(item, b ...
随机推荐
- Chrome浏览器 调试工具 vue-devtools 的安装和使用
https://www.cnblogs.com/yuqing6/p/7440549.html
- [leetcode]55. Jump Game青蛙跳(能否跳到终点)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Spyder设置代码自动补全
1.spyder 代码自动补齐设置方式在tools->preferences->IPython console->advanced Settings 下面,把User the gre ...
- dtruss
一.简介 系统调用跟踪工具. 二.实例
- c++11 线程池学习笔记 (二) 线程池
学习内容来自以下地址 http://www.cnblogs.com/qicosmos/p/4772486.html github https://github.com/qicosmos/cosmos ...
- vue中的import、export、requre的区别
在es6之前js一直没有自己的模块语法,为了解决这种尴尬就有了require.js的出现.在es6发布之后js又引入了import的概念使得不清楚两者之间的区别的同学在实际使用过程中造成了自己的误解, ...
- 1.3eigen中数组类和系数的运算
1.3数组类和系数的运算 与矩阵类只适用与线性代数运算相反,数组类提供通用的数组类,能不利用线性代数的知识来对系数进行操作,比如对每个系数加上一个常数,或者乘上两个数组的系数. 1.数组类型 跟矩阵类 ...
- MYSQL性能查看(多指标)
网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一 ...
- 2019.02.17 spoj Query on a tree VII(链分治)
传送门 跟QTREE6QTREE6QTREE6神似,改成了求连通块里的最大值. 于是我们对每条链开一个heapheapheap维护一下即可. MDMDMD终于1A1A1A链分治了. 代码: #incl ...
- mysql常用连接查询
连接数据库PDO $user = "root"; //数据库连接账号 $pass = "root"; //数据库连接密码 $dbname = "tes ...