鱼C论坛

 找回密码
 立即注册
查看: 1584|回复: 4

[已解决]想问一下各位为什么会是这个结果?

[复制链接]
发表于 2021-3-27 10:11:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def func(x= [],y = [6,7]):
    x.append(8)
    y.append(8)
    return(x + y)
a,b = [1,2],[3,4]
t = func(x = a)
t = func(y = b)
print(func(),end = ";")

请问各位大佬,为何最后打印出来的是[8, 8, 6, 7, 8, 8];
最佳答案
2021-3-27 20:45:37
应该是因为 x 和 y 都是 列表类型(其实是“引用类型”),并且作为形参,
不是123这样的数值或字符类型(基本数据类型),这样,
在调用时,可能导致了x和y传递的实参 没有被释放。

这里 t = func(x=a) 后,y=[6,7,8] 没有被释放;
而 t = func(y=b) 后,虽然 y被重新赋值(被释放了),但 x = [8] 没有被释放。

注 :x=[]只是形参,没有实参传进来,就不会执行(没重新初始化);而后 x.append(8) 则再次引用/指向 没有被释放的 x为[8] 的地址,故最后 x 变为 [8, 8] 。

同理,最后,再调用 func(),也就可以理解了,同样是因为 x, y都没有被释放,所以 是 [8, 8] + [6, 7, 8, 8]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-27 10:25:38 | 显示全部楼层
def func(x= [],y = [6,7]):
    x.append(8)
    y.append(8)
    return(x + y)

a,b = [1,2],[3,4]
t = func(x = a)                        # 这里 运行之后 默认参数 y = [6, 7, 8]
t = func(y = b)                        # 这里 运行之后 默认参数 x = [8]
print(func(),end = ";")        # 这里 又对默认参数append  x变为[8, 8] y变为[6, 7, 8, 8]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2021-3-27 19:12:11 | 显示全部楼层
因为func不是纯函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-27 20:45:37 | 显示全部楼层    本楼为最佳答案   
应该是因为 x 和 y 都是 列表类型(其实是“引用类型”),并且作为形参,
不是123这样的数值或字符类型(基本数据类型),这样,
在调用时,可能导致了x和y传递的实参 没有被释放。

这里 t = func(x=a) 后,y=[6,7,8] 没有被释放;
而 t = func(y=b) 后,虽然 y被重新赋值(被释放了),但 x = [8] 没有被释放。

注 :x=[]只是形参,没有实参传进来,就不会执行(没重新初始化);而后 x.append(8) 则再次引用/指向 没有被释放的 x为[8] 的地址,故最后 x 变为 [8, 8] 。

同理,最后,再调用 func(),也就可以理解了,同样是因为 x, y都没有被释放,所以 是 [8, 8] + [6, 7, 8, 8]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-27 21:45:04 | 显示全部楼层
python垃圾回收机制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 04:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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