2392688470 发表于 2021-7-7 22:53:36

函数参数

本帖最后由 2392688470 于 2021-7-7 22:56 编辑

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

阿奇_o 发表于 2021-7-7 23:25:18

这就是 传说中的 “危险写法”,哈哈哈

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

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


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

{:10_297:}

leafu 发表于 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()
40646400

>>> a()
46703808
['END']
>>> a()
46703808
['END', 'END']
>>> a()
46705536

>>>

西瓜味的苹果 发表于 2021-7-8 14:41:53

你这样写很危险啊,我要是接手的代码谁这样写,打死他

学渣李某人 发表于 2021-7-8 17:12:30

应该用所谓的"None魔法", 参数默认值设None, 内部判断如果参数为None再设置成[]
如:
def func(a=None):
    if a == None:
      a = []
页: [1]
查看完整版本: 函数参数