今天看到一段代码,其中函数入参有一个参数为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之函数参数问题(参数为可变对象)的更多相关文章

  1. python定义函数时默认参数注意事项

    如果在调用一个函数时,没有传递默认参数,则函数内的默认参数是对函数的默认参数属性__defaults__的引用, 如 def func(arg1=[]): arg1.append(2) 调用func时 ...

  2. Python 中函数的 收集参数 机制

    定义函数的时候,在参数前加了一个 * 号,函数可以接收零个或多个值作为参数.返回结果是一个元组. 传递零个参数时函数并不报错,而是返回一个空元组.但以上这种方法也有局限性,它不能收集关键字参数. 对关 ...

  3. Python的函数名作为参数传入调用以及map、reduce、filter

    零.python的lambda函数: #lambda function func = lambda x : x+1 #这里是一个匿名函数,x是参数,x+1是对参数的操作 func(1)= 2 多个参数 ...

  4. Python虚拟机函数机制之参数类别(三)

    参数类别 我们在Python虚拟机函数机制之无参调用(一)和Python虚拟机函数机制之名字空间(二)这两个章节中,分别PyFunctionObject对象和函数执行时的名字空间.本章,我们来剖析一下 ...

  5. python定义函数时的参数&调用函数时的传参

    一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...

  6. 【python】-- 函数非固定参数,返回值(return)

    函数非固定参数 1.默认参数: 代码如下: def information_register(name,age,country,sex): print("----注册信息------&quo ...

  7. python笔记四(dict/set/不可变对象)

    一.dict 字典是包含key_value存储方式.在放进去的时候,必须根据key值Hash出value的存放位置,这样,取的时候才能根据key直接拿到value. dict的操作: d = {'Mi ...

  8. python之函数形参、实参、可变长参数整体使用和分类

    形参与实参 '''def fn(形参们): pass fn(实参们)'''# 形参:定义函数,在括号内声明的变量名,用来结束外界传来的值# 实参:调用函数,在括号内传入的实际值,值可以为常量.变量.表 ...

  9. python默认参数不能定义为可变对象类型

    python的默认参数只会在函数定义时被确定,而不是每次调用时重新确定,所以,一旦在函数中修改了默认参数,则在随后的调用中都会生效 由于这个特性,在定义函数时,如果默认参数使用可变的对象类型,如空列表 ...

  10. python中函数的默认参数陷阱问题

    其实也不能说是陷阱,只是一个不容易注意到的地方,尤其是有其他java/c++类编程语言经验的人员,这里涉及到python的一个特点,所以笔者说是陷阱只是一个噱头而已. def test(item, b ...

随机推荐

  1. python 处理时间 datetime 三板斧

    import datetime1)#str -> datetime对象,(datetime对象之间可加减,date[0]为str) datetime.datetime.strptime(date ...

  2. HBase Snapshot原理和实现

    HBase 从0.95开始引入了Snapshot,可以对table进行Snapshot,也可以Restore到Snapshot.Snapshot可以在线做,也可以离线做.Snapshot的实现不涉及到 ...

  3. Unity 2018 By Example 2nd Edition

    Unity is the most exciting and popular engine used for developing games. With its 2018 release, Unit ...

  4. redis集群密码设置

    1.密码设置(推荐)方式一:修改所有Redis集群中的redis.conf文件加入: masterauth passwd123 requirepass passwd123 说明:这种方式需要重新启动各 ...

  5. node.js 使用 net 模块模拟 websocket 握手,进行数据传递。

    websocket 是一种让浏览器与服务器之间建立持久的连接,并能进行双向数据传输的一种协议. websocket 属性应用层协议,基于tcp传输协议,并复用http的握手通道. 一.如何进行webs ...

  6. Linux驱动之异常处理体系结构简析

    异常的概念在单片机中也接触过,它的意思是让CPU可以暂停当前的事情,跳到异常处理程序去执行.以前写单片机裸机程序属于前后台程序,前台指的就是mian函数里的while(1)大循环,后台指的就是产生异常 ...

  7. javaweb开发1.环境配置(javaweb插件下载及tomact在eclips中配置)

    一.下载javaweb插件 1.安装好jdk,下载eclips(Juno版本) 2.打开eclips,安装Web插件和JavaEE插件 3 在Eclipse中菜单help选项中选择install ne ...

  8. playframework 一步一步来 之 日志(一)

    日志模块是一个系统中必不可少的一部分,它可以帮助我们写程序的时候查看错误信息,利于调试和维护,在业务面,它也可以记录系统的一些关键性的操作,便于系统信息的监控和追踪. play的日志是基于logbac ...

  9. You are using pip version 9.0.1, however version 9.0.3 is available.

    1,pip不能用了,提示:You are using pip version 8.1.1, however version 9.0.1 is available.网上搜索了一箩筐的安装程序,各种安装, ...

  10. 一不注意,在Unity3D中DllImport 引起的Bug.

    单要说这个Bug是很简单,但是得从头说起. 一些大型的网络游戏,或者加载比较多的一些场景时,如果要等待所有模型,贴图等各种资源文件加载完毕才能执行游戏,对用户将会是一个很头大的事情.所以就需要用到动态 ...