- 主题:求教:关于函数对象和缺省参数
翻历史贴,偶然发现一个帖子,自己不明白了
求教该如何理解
>>> def f(a, l = []):
... l.append(a)
... return l
...
>>> f(1)
[1]
>>> f(2)
[1, 2]
>>> f(1)
[1, 2, 1]
>>> f(1,[])
[1]
>>> f(2)
[1, 2, 1, 2]
>>> f(3,[])
[3]
>>> f(3)
[1, 2, 1, 2, 3]
>>>
--
FROM 111.196.167.*
每次带列表参数,就会重新申请地址
【 在 lazyfintech 的大作中提到: 】
: 翻历史贴,偶然发现一个帖子,自己不明白了
: 求教该如何理解
: >>> def f(a, l = []):
: ...................
--
FROM 113.137.37.*
不明白的是,列表缺省参数是[],为什么每次调用会使用之前的list
不知道老外有没有这块儿的说明
【 在 dabada 的大作中提到: 】
: 每次带列表参数,就会重新申请地址
:
--
FROM 111.196.167.*
【 在 lazyfintech 的大作中提到: 】
: 不明白的是,列表缺省参数是[],为什么每次调用会使用之前的list
: 不知道老外有没有这块儿的说明
:
举个例子, 比如,
函数是化缘,
def 化缘(和尚, 钵盂= [])
钵盂.append(斋饭)
函数本身也是一个对象, 这个对象创建的时候, 生成了一个缺失的空钵盂,
下面假定它是唐僧团队用的那个紫金钵, 因为,默认取经队伍使用。
化缘(唐僧)
钵盂里多了一个馒头
化缘(黄袍怪, 钵盂), 这个时候, 传进来一个空钵盂,
这个钵盂是黄袍怪变出来的, 化缘完成, 这个钵盂只有一个馒头。
化缘(悟空)
钵盂里又多了一个馒头。
化缘(观音菩萨, 钵盂), 这个时候又传进来一个钵盂, 这个钵盂是观音的玉净瓶变化的。
所以, 它和唐僧团队, 黄袍怪用的钵盂都不一样。
化缘结果,玉净瓶钵盂里多了一个馒头。
--
FROM 115.171.244.*
函数的初始化只会进行一次,也就是说 默认参数也只初始化一次, 而不是每次调用都会重新初始化 默认参数。
def f(a, l = []):
...
等价于
initial_value = [] # 不管调用多少次f, 在不对l传参时 都会共用这个初始值
def f(a, l = initial_value):
...
【 在 lazyfintech 的大作中提到: 】
: 翻历史贴,偶然发现一个帖子,自己不明白了
: 求教该如何理解
: >>> def f(a, l = []):
: ...................
--
修改:lambo FROM 135.0.250.*
FROM 135.0.250.*
多谢楼上各位
--
FROM 111.196.167.*
刚看了觉得有点奇怪,其实如果换成c++就好理解了。对比一下假如默认参数是一个指针,指向一个已分配空间的地址,那么每次调用都有可能改变这个指针所指向的内容的值。
--
FROM 61.149.5.*
def f(a, l = None):
if l == None:
l = []
l.append(a)
return l
python里面就不要用空列表作为默认参数,一定要用None。
【 在 lazyfintech 的大作中提到: 】
: 翻历史贴,偶然发现一个帖子,自己不明白了
: 求教该如何理解
: >>> def f(a, l = []):
: ...................
--
FROM 101.88.43.*
也是根据前面的回复这么想的
函数对象创建后,内存空间确定了,默认参数对应的空间也确定了
上面的回帖提到默认参数只初始化一次,这么理解后面调用就不会再重置了
【 在 olddognewwit 的大作中提到: 】
: 刚看了觉得有点奇怪,其实如果换成c++就好理解了。对比一下假如默认参数是一个指针,指向一个已分配空间的地址,那么每次调用都有可能改变这个指针所指向的内容的值。
--
FROM 111.196.167.*
谢谢
【 在 giftcard1 的大作中提到: 】
: def f(a, l = None):
: if l == None:
: l = []
: ...................
--
FROM 111.196.167.*