|
发表于 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] |
|