- 主题:求教:关于函数对象和缺省参数
【 在 lazyfintech 的大作中提到: 】
: 不明白的是,列表缺省参数是[],为什么每次调用会使用之前的list
: 不知道老外有没有这块儿的说明
:
举个例子, 比如,
函数是化缘,
def 化缘(和尚, 钵盂= [])
钵盂.append(斋饭)
函数本身也是一个对象, 这个对象创建的时候, 生成了一个缺失的空钵盂,
下面假定它是唐僧团队用的那个紫金钵, 因为,默认取经队伍使用。
化缘(唐僧)
钵盂里多了一个馒头
化缘(黄袍怪, 钵盂), 这个时候, 传进来一个空钵盂,
这个钵盂是黄袍怪变出来的, 化缘完成, 这个钵盂只有一个馒头。
化缘(悟空)
钵盂里又多了一个馒头。
化缘(观音菩萨, 钵盂), 这个时候又传进来一个钵盂, 这个钵盂是观音的玉净瓶变化的。
所以, 它和唐僧团队, 黄袍怪用的钵盂都不一样。
化缘结果,玉净瓶钵盂里多了一个馒头。
--
FROM 115.171.244.*
【 在 olddognewwit 的大作中提到: 】
: 刚看了觉得有点奇怪,其实如果换成c++就好理解了。对比一下假如默认参数是一个指针,指向一个已分配空间的地址,那么每次调用都有可能改变这个指针所指向的内容的值。
其实, 还是有些区别的,
python里面都是对象, 函数是对象, 类也是对象, 这一点和c++是不一样的。
切换到这个问题,
前面说的, f这个函数,只会执行一次初始化, 从而生成默认参数, 这种说法是不准确的,
实际上, f函数生成的对象,作为一个对象,是被多次使用, 只是增加减少了引用计数, 因为一直使用的是同一个函数对象,当然这个对象生成时产生的默认参数是同一个对象。
我的意思是说, 你完全可以把它del掉, 或者说, 触发析构函数, 在重新加载,或者创建这个函数对象, 如果发生了重新创建, 这个对象的默认参数也会触发重新生成。
--
修改:poggy FROM 115.171.244.*
FROM 115.171.244.*