鱼C论坛

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

函数参数

[复制链接]
发表于 2021-7-7 22:53:36 From FishC Mobile | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 2392688470 于 2021-7-7 22:56 编辑

66fec41b91e3f482.jpg 请问这个输3次add_end()能打印3个end
然后再次调用[1,2,3]为啥又给它重置呢
确实看不明白

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-7 23:25:18 | 显示全部楼层
这就是 传说中的 “危险写法”,哈哈哈

因为 list列表(等容器类型的数据类型),id 指向 容器地址,里面的具体元素,里面具体的值,会根据不同的情形有所不同。
你这里,参数 L=[] , 当 add_end([1,2,3]) 时,即 add_end(L=[1,2,3]) ,于是,L就指向了列表容器[1, 2, 3],于是经过append(),结果为 [1, 2, 3, 'END']
接着, 你调用 add_end() 即 add_end(L=[]),这是 L指向的是 [] 一个空列表容器;
下一行你又调用add_end(), 即 又调用 add_end(L=[]),这时奇妙的事情发生,Python没有指向 新的空列表,而是指向上一行生成的那个列表(容器地址不变,但里面元素内容变了)
再下一行,也是同理,还是指向 那个“空列表”的“外壳”(容器地址),但里面的内容会改变。

再下一行,add_end([4, 5]) 即 add_end(L=[4, 5]) , 这时,Python会 为 L=[4, 5] 开辟新的内存, 指向该新的容器地址,于是 结果里没有之前的那些 'END',而是 [4, 5, 'END']


OK, 过程,基本就是这样子。——所以,熟手们都会告诉你,不要 在参数列表里的 写 ls = [] 这样的代码,
而要写 ls=None 或 不写,需要 =[] 可以在方法体里定义,如 if ls is None: ls = []

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-8 10:50:26 | 显示全部楼层
阿奇_o 发表于 2021-7-7 23:25
这就是 传说中的 “危险写法”,哈哈哈

因为 list列表(等容器类型的数据类型),id 指向 容器地址,里 ...

补充说明
>>> def a(b=[]):
        b.append('END')
        print(id(b))
        id(b)
        return b

>>> a([1,2,3])
40646400
[1, 2, 3, 'END']
>>> a()
46703808
['END']
>>> a()
46703808
['END', 'END']
>>> a([4,5])
46705536
[4, 5, 'END']
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-8 14:41:53 | 显示全部楼层
你这样写很危险啊,我要是接手的代码谁这样写,打死他
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-8 17:12:30 | 显示全部楼层
应该用所谓的"None魔法", 参数默认值设None, 内部判断如果参数为None再设置成[]
如:
def func(a=None):
    if a == None:
        a = []
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-14 20:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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