今天看到一段代码,其中函数入参有一个参数为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. netty(一) netty有哪几部分构成

    netty netty是一个支持高并发的非阻塞I/O框架. Channel Channel 是 NIO 基本的结构.它代表了一个用于连接到实体如硬件设备.文件.网络套接字或程序组件,能够执行一个或多个 ...

  2. flutter 自己整理

    2018-05 资料 常见问题解决处 https://flutter.io/flutter-for-android/ 起步 api widget https://flutter.io/docs/ 其他 ...

  3. HashMap的tableSizeFor方法解读

    static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> ...

  4. Django自动获取项目中的全部URL

    import re from collections import OrderedDict from django.conf import settings from django.utils.mod ...

  5. 利用Linux信号SIGUSR1调试程序

    Linux嵌入式由于诸多的限制,调试方法有限,常常出现面对Bug束手无策的情况,现在介绍一种通过信号处理对Linux嵌入式应用程序进行调试的方法. linux中一共有32种信号,在/usr/inclu ...

  6. SpringMVC学习笔记:拦截器和过滤器

    首先说明一下二者的区别: 1. 拦截器基于java的反射机制,而过滤器是基于函数回调 2. 拦截器不依赖于servlet容器,过滤器依赖servlet容器 3. 拦截器只能对action请求起作用,而 ...

  7. [uboot] (第五章)uboot流程——uboot启动流程

    http://blog.csdn.net/ooonebook/article/details/53070065 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...

  8. xbeePRO900HP的几个关键参数

    xbee PRO 900HP又叫xbee PRO S3B,在模块的正面有S3B的字样: 因为用到这个模块的,多用的是digimesh组网固件,所以以下参数修改只针对digimesh的修改:市面上的xb ...

  9. php.ini 配置详解

    这个文件必须命名为''php.ini''并放置在httpd.conf中的PHPIniDir指令指定的目录中.最新版本的php.ini可以在下面两个位置查看:http://cvs.php.net/vie ...

  10. centos 安装tmux

    安装tmux之前需要先安装一些支持的组件: yum install libevent-devel ncurses-devel 接下来就是下载源码包进行安装了,以1.6版本举例 wget http:// ...