下面两个函数:
def func1(x):
x = list(set(x))
return len(x)
def func2(x):
x[:len(x)] = list(set(x))
return len(x)
-->L = [0,0,1,2,3]
-->func1(L)
4
-->L
[0,0,1,2,3] # l并未改变
-->func2(L)
4
-->l
[0,1,2,3] # l改变
我知道func2为何会改变L, 但是不知道为何func1不改变L。
望不吝赐教 谢谢!
首先,你需要理解python中【赋值语句】的行为。跟C语言不同,python中的【var=value】读作“把var变量标签分配给value对象”,而不是反过来。
上述代码可见,两个变量具有相同的内存地址,这在C语言中是不可想象的。
python中的变量就只是个名字,没有自己的地址、类型和值,它只能通过“附着”在【对象】上,临时获得后者的地址、类型和值。
然后,你要理解【foo[index]=value】并非普通的赋值语句,而是在背后调用了foo.__setitem__(index, value)方法。
所以,切片赋值语句能够修改列表对象,而普通的赋值语句无法修改列表对象。