|  | 
 
 发表于 2021-7-16 17:14:49
|
显示全部楼层 
| 像你的代码这样,只是 ls,就代表你这个参数没有默认值
 没有默认值,你调用的时候就必须传参
 a=func([])
 b=func([])
 这时 ls 这个变量指向的就是你传入的 []
 你在函数里开头打印一下它的id
 复制代码def func(ls):
    print(id(ls))
    ls.append(2)
    print(ls)
    return ls
a=func([])
b=func([])
print(a,b)
会发现,就算同样是 [] ,它们的储存地址也是不一样的,是不同的两个列表
 而有默认值的参数,该默认值在定义函数前就创建了,类似于
 复制代码a = []
def func(ls):
    print(id(ls))
    ls.append(2)
    print(ls)
    return ls
a=func(a)
b=func(a)
print(a,b)
就是说,你参数有默认值,而之后调用参数的时候没有进行传参,则 变量ls默认指向你的默认值的id,如
 
 复制代码def func(ls=[]):
    print(id(ls))
    ls.append(2)
    print(ls)
    return ls
a=func()
b=func([6])
c=func()
print(a,b,c)
a没有进行传参,所以,ls默认指向[],在[]中添加2,成[2]
 b进行了传参,则,ls指向传入的参数[6],在该列表中添加2,成[6,2]
 注,此时实际有两个列表了,一个[2],另一个[6,2]
 c同样没有进行传参,所以,ls依旧指向默认值的id,而此时该默认值为[2]
 列表中的值虽然变了,不过列表还是默认的那个列表,在该列表中添加2,成[2,2]
 即,此时python存储了两个列表,一个是默认的列表,一个是你自己定义的列表,
 一个为[2,2], 一个为[6,2]
 | 
 |