一、赋值操作并没有创建新列表,只是内存地址的赋值操作,两个列表的内存地址是一样的
= 赋值操作并不会创建新对象,只是把一个变量的内存地址赋值给另一个变量
old_lst = [1, 2, 3] new_lst = old_lst print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)
执行结果:
32645384 32645384 old_lst: [1, 2, 3] new_lst: [1, 2, 3] old_lst: [1, 2, 3, 666] new_lst: [1, 2, 3, 666]
二、 浅拷贝:copy浅拷贝,只拷贝一层内容,复制一个表面,更深层次的内容,只拷贝一个内存地址。浅拷贝可以通过两种方式实现,一种是切片赋值,一种是copy()函数
拷贝的意义:快速的创建对象。
1.1.列表切片赋值 两个列表的内存地址不一样(简单的列表,列表元素不包括列表类型)
old_lst = [1, 2, 3] new_lst = old_lst[:] print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)
执行结果:
43655432 43656456 old_lst: [1, 2, 3] new_lst: [1, 2, 3] old_lst: [1, 2, 3, 666] new_lst: [1, 2, 3]
1.2.列表切片赋值 两个列表的内存地址不一样(复杂些的列表,列表元素包括列表类型)
old_lst = [1, [2, 3]] new_lst = old_lst[:] old_lst[1].append(666) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst)
执行结果:
43524296 43525384 old_lst: [1, [2, 3, 666]] new_lst: [1, [2, 3, 666]]
2.1.浅拷贝,只拷贝一层,copy() 两个列表的内存地址不一样(简单的列表,列表元素不包括列表类型)
old_lst = [1, 2, 3] new_lst = old_lst.copy() print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)
执行结果:
43524360 43525384 old_lst: [1, 2, 3] new_lst: [1, 2, 3] old_lst: [1, 2, 3, 666] new_lst: [1, 2, 3]
2.2.浅拷贝,只拷贝一层,copy() 两个列表的内存地址不一样(复杂些的列表,列表元素包括列表类型)
old_lst = [1, [2, 3]] new_lst = old_lst.copy() old_lst[1].append(666) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst)
执行结果:
43720904 43721992 old_lst: [1, [2, 3, 666]] new_lst: [1, [2, 3, 666]]
三、深拷贝:把内容完全的复制一份
import copy
copy.deepcopy()
两个列表的内存地址不一样,两个列表没有任何的关联了
1.1(简单的列表,列表元素不包括列表类型)
import copy
old_lst = [1, 2, 3] new_lst = copy.deepcopy(old_lst) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst) old_lst.append(666) print("old_lst:", old_lst) print("new_lst:", new_lst)
执行结果:
37430600 37446088 old_lst: [1, 2, 3] new_lst: [1, 2, 3] old_lst: [1, 2, 3, 666] new_lst: [1, 2, 3]
1.2(复杂些的列表,列表元素包括列表类型)
import copy
old_lst = [1, [2, 3]] new_lst = copy.deepcopy(old_lst) old_lst[1].append(666) print(id(old_lst)) print(id(new_lst)) print("old_lst:", old_lst) print("new_lst:", new_lst)
执行结果:
43787592 43804168 old_lst: [1, [2, 3, 666]] new_lst: [1, [2, 3]]
四、函数的默认值参数类型如果是可变类型的,注意,这个参数是共享的(大坑哦)(不可变参数:str bool int tuple)
1.1 实例一
def func(lst=[]): lst.append(123) print(id(lst), lst) func() func() func()
执行结果:
36175624 [123] 36175624 [123, 123] 36175624 [123, 123, 123]
1.2 实例二
函数的默认值参数类型如果是可变类型的,注意,这个参数是共享的(大坑哦)
def func(lst=[]): lst.append(123) print(id(lst), lst) func() func([]) func()
执行结果:
43384584 [123] 43394440 [123] 43384584 [123, 123]