妙用python函数的默认可变参数

2021年5月14日 / 57次阅读 / Last Modified 2021年5月14日
函数

所谓函数的默认可变参数,是指函数的默认参数为一个空的list或空的dict对象。python官方教程里面介绍过,只是要大家小心,这个默认的可变参数,可能会带来意料之外的行为。比如:

>>> def test(a=[]):
...     a.append(1)
...     print(a)
...
>>> test()
[1]
>>> test()
[1, 1]
>>> test()
[1, 1, 1]
>>> test()
[1, 1, 1, 1]
>>> test([1,2,3])
[1, 2, 3, 1]

test函数的参数a,默认指向了一个空的list,函数每执行一次,都会向这个mutable的list中apend一个数字1,test函数在调用之前,a的指向已经被初始化(python所有对象的内存都在heap中),以后每次调用,a的指向不变,除非调用的时候修改默认值。

这种用法很trick,这样的默认参数,有点像函数的惊天变量。我们一般是不这么用的,但在某些时候,这样的语法很妙。如下是一个统计进程内存变化的函数,每次调用,都会显示出进程所占内存的变量情况:

>>> import psutil
>>>
>>> def mem_growth(stat={}):
...     p = psutil.Process()
...     delta_rss = p.memory_info().rss - stat.get('rss',0)
...     delta_vms = p.memory_info().vms - stat.get('vms',0)
...     print('rss:', '+'+str(delta_rss) if delta_rss>=0 else delta_rss)
...     print('vms:', '+'+str(delta_vms) if delta_vms>=0 else delta_vms)
...     stat['rss'] = p.memory_info().rss
...     stat['vms'] = p.memory_info().vms
...
>>> mem_growth()
rss: +13737984
vms: +24219648
>>> mem_growth()
rss: +0
vms: +0
>>>
>>> a = [i for i in range(100000)]
>>> mem_growth()
rss: +3510272
vms: +4726784
>>>
>>> del a
>>> mem_growth()
rss: -2691072
vms: -2883584
>>> mem_growth()
rss: -57344
vms: -262144
>>> mem_growth()
rss: +0
vms: +0
>>> mem_growth()
rss: +0
vms: +0

每次mem_growth被调用(除了第1次),都会用当前的内存数据与上一次调用时记录的内存数据进行比较并显示输出。如果不适用默认的 stat={} 参数,就需要一个全局变量来记录数据,或者创建一个闭包,但就这样用法,最简单最妙!

-- EOF --

本文链接:https://www.pynote.net/archives/3664

留言区

您的电子邮箱地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top