函数参数
本帖最后由 2392688470 于 2021-7-7 22:56 编辑请问这个输3次add_end()能打印3个end
然后再次调用[1,2,3]为啥又给它重置呢
确实看不明白 这就是 传说中的 “危险写法”,哈哈哈
因为 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:} 阿奇_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
>>> 你这样写很危险啊,我要是接手的代码谁这样写,打死他 应该用所谓的"None魔法", 参数默认值设None, 内部判断如果参数为None再设置成[]
如:
def func(a=None):
if a == None:
a = []
页:
[1]