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()

结果如下:

第二次调用的时候,pidlist并不是空的

所以对于可变参数,特别需要注意,如列表等都可能产生这样的问题

我们可以对代码做如下处理即可正常使用:

def linux_monitor(pid=0,pidlist = None):  if pidlist == None:    pidlist = []  pidlist.append(pid)

大家可以试一下

原文地址:https://www.cnblogs.com/watertaro/p/9278846.html

时间: 2024-10-07 21:37:09

python之函数参数问题(参数为可变对象)的相关文章

关于python的函数的*和**参数:

1.将足够的参数解包以后传递给函数:>def f(p1, p2, p3, p4):>     print p1+p2+p3+p4>>li = [1, 2, 3, 4]>f(*li)10>>tu = (1, 2, 3, 4)>f(*tu)10>>di = {'p1':1, 'p2':2, 'p3':3, 'p4':4}>f(**di)>10 2.使用封包的方法访问多余的参数>>> def funct(*para, **

PYTHON 写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。

def shifou_space(args): ret = True for a in args: if a.isspace(): ret = False break return ret result = shifou_space("123 12312") print("有空格",result)

Python的函数参数和递归参数

位置参数 def power(x): return x*x; 默认参数 指的是在函数定义的时候,就赋予一些参数默认值,在调用这个函数的时候不必多次传入重复的参数值. 如定义一个多次输出同一个年龄阶段和同一个城市的学生的姓名和性别. def info(name,gender,age=20,city='sichuan'): print('name:', name) print('gender:', gender) print('age',age) print('city',city) info("x

python中函数参数的引用方式

值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用"的方式.这种方式相当于传值和传引用的一种综合.如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过"传引用"来传递对象.如果函数收到的是一个不可变对象(比如数字.字符或者元组)的引用,就不能直接修改原始对象--相当于通过"传值

Python函数的默认参数的设计【原创】

在Python教程里,针对默认参数,给了一个“重要警告”的例子: def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3)) 默认值只会执行一次,也没说原因.会打印出结果: [1] [1, 2] [1, 2, 3] 因为学的第一门语言是Ruby,所以感觉有些奇怪. 但肯定的是方法f一定储存了变量L. 准备知识:指针 p指向不可变对象,比如数字.则相当于p指针指向了不同的内存地址. p指向的是可变对象,比如lis

C/C++ Python的函数默认参数

发现C/C++  Python的函数可以使用默认参数,来减少传参时候的参数个数. 但是:这样的默认参数最好是不变对象! #include <stdio.h> #include <string.h> void func_1(int id, char s[], char city[] = "Bejing") { printf("%d, %s, %s",id, s, city); } int main() { func_1(1, "李金旭

Python中list作为默认参数的陷阱

在Python中,作为默认参数的一定要是不可变对象,如果是可变对象,就会出现问题,稍不注意,就会调入陷阱,尤其是初学者,比如我(┬_┬). 我们来看一个例子. 1 def add(L=[]): 2 L.append(1) 3 return L 4 5 L = [1, 2, 3] 6 newL = add(L) 7 print(newL) 8 newL = add(newL) 9 print(newL) 10 11 testL = add() 12 print(testL) 13 testL =

函数定义及参数

# -*- coding: UTF-8 -*-#函数参数 '''定义函数可以用必选参数,默认参数,可变参数,关键字参数和命名关键字参数,参数定义顺序为必选参数,默认参数,可变参数,关键字参数和命名关键字参数函数调用的时候,会自动按照参数位置和参数名把对应参数传递进去注意点:1.必选参数在前,默认参数在后2.默认参数要用不可变对象,如果是可变对象,运行会有逻辑错误3.*arg是可变参数,args接受的是一个tuple4.**kw是关键字参数,kw接收的是一个dict ''' def functio

Python入门之python可变对象与不可变对象

本文分为如下几个部分 概念 地址问题 作为函数参数 可变参数在类中使用 函数默认参数 类的实现上的差异 概念 可变对象与不可变对象的区别在于对象本身是否可变. python内置的一些类型中 可变对象:list dict set 不可变对象:tuple string int float bool 举一个例子 # 可变对象 >>> a = [1, 2, 3] >>> a[1] = 4 >>> a [1, 4, 3] # 不可变对象 >>>

Python随笔-函数

在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. def GetMax(v1, v2):#注意冒号 if v1>v2:#注意冒号 return v1 else:#注意冒号 return v2 print(GetMax(1,2)) 如果想定义一个什么事也不做的空函数,可以用pass语句: >>> def fun(): pass pass还可以用在其他语句,比如: if age