找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3571|回复: 8

[求助] 函数默认值构造

2

主题

6

帖子

6

积分

贫民

积分
6
Seejv 发表于 2018-7-6 17:50:27 | 显示全部楼层 |阅读模式
>>> def grow(L=[]):
...         L.append(len(L))
...         return L
...
>>> grow()
[0]
>>> grow()  #为什么不是[0]
[0, 1]
>>> grow()
[0, 1, 2]
>>> grow()
[0, 1, 2, 3]
>>>

造成这种结果的主要原因是什么?

回复

使用道具 举报

2

主题

6

帖子

6

积分

贫民

积分
6
Seejv  楼主| 发表于 2018-7-9 11:50:47 | 显示全部楼层
大概明白了:(本人这里将id()  类比做C中的指针, 若该前提有误, 则下面的解释是错误的!!)
python中 若是函数中有默认参数,则参数值只初始化一次,并且该参数是不被释放的(其id()不会改变)。
而append()并不会修改到原来L的id() 所以每调用一次就累加了一次
回复 支持 1 反对 0

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2018-7-9 10:03:28 | 显示全部楼层
本帖最后由 sheeboard 于 2018-7-9 10:12 编辑

你需要每次把L[]初始化一次,
https://www.pythoncentral.io/fun-with-python-function-parameters/
标题potential python function parameter problems

回复 支持 1 反对 0

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2018-7-7 21:07:24 | 显示全部楼层
list L里每次添加的是长度数字,L[0]的长度是1,所以添加后变成了L[0,1]
回复 支持 反对

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
muhu325 发表于 2018-7-7 21:53:48 | 显示全部楼层
第一次grow(),L取值默认值;第二次执行grow()时,L已经有值,就不会取默认值了。
回复 支持 反对

使用道具 举报

2

主题

6

帖子

6

积分

贫民

积分
6
Seejv  楼主| 发表于 2018-7-9 09:45:01 | 显示全部楼层
muhu325 发表于 2018-7-7 21:53
第一次grow(),L取值默认值;第二次执行grow()时,L已经有值,就不会取默认值了。 ...

但是grow()调用完毕后L不是会被释放吗?
所以结果应该都是[0]才对,不管调用几次
回复 支持 反对

使用道具 举报

2

主题

6

帖子

6

积分

贫民

积分
6
Seejv  楼主| 发表于 2018-7-9 09:50:16 | 显示全部楼层
sheeboard 发表于 2018-7-7 21:07
list L里每次添加的是长度数字,L[0]的长度是1,所以添加后变成了L[0,1]

主要是对这个现象不太能理解, 函数一调用完毕L就被释放了, 重新调用则重新载入内存,那么结果应该都是[0]才对啊
回复 支持 反对

使用道具 举报

1

主题

11

帖子

11

积分

贫民

积分
11
x1wen 发表于 2018-7-14 11:35:20 | 显示全部楼层
L是一个list,而你每次append的是L的长度,L=[],len(L)=0;之后你将len(L)=0插入到了L中,L是L[0]了,此时len(L)=1,依次类推,不知道你明白没有。问题根源应该是你没明白len、append、list啥意思。
回复 支持 反对

使用道具 举报

1

主题

11

帖子

11

积分

贫民

积分
11
x1wen 发表于 2018-7-14 11:40:57 | 显示全部楼层
Seejv 发表于 2018-7-9 09:50
主要是对这个现象不太能理解, 函数一调用完毕L就被释放了, 重新调用则重新载入内存,那么结果应该都是[ ...

学习了,因确实挺
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表