刚上了第二周python课,这节课是关于python序列之列表的
整理一下自己在学习过程中遇到困惑的地方,自用。
首先python中有一个符号[:]
这个符号的作用是切片复制,它不同于赋值,只是将数组的值复制过去,但是其内存地址是不同的。
a = [1,2,3];
b =a ;
print(a is b );控制台输出结果为True
a = [1,3,4];
b = a[:];切片复制数组的值给b
print(b);
print(a is b);控制台输出结果False
为什么会出现这样的结果,那是因为第二部分,b = a [:]
此时我们在其下面再输入
print(id(a));
print(id(b));
则会得到两个不同的地址,这就是为什么print(a is b)输出为False的原因。
zhang = [‘san’ ,[‘age’,20]];
li = zhang[:];
print(li is zhang);控制台输出False
li[0] = ‘si’;
li[1][1] = 30;
print(li) ;控制台输出['si',['age',30]]
print(zhang);控制台输出['san',['age',30]]
这时候我们发现,变量zhang的年龄数值被污染了,也变成了 30。这就是浅复制。
- 浅复制 只拷贝父对象,不会拷贝对象的内部的子对象。
- 深复制 拷贝对象及其子对象因
为切片仅仅复制了第一层,而一开始变量zhang就是个嵌套数组,所以第二层的数据并没有被复制,在第二层数据它们使用这同一块内存地址,所以zhang的年龄数值就会被污染。改进方法如下:
zhang = [‘san’ ,[‘age’,20]];
li = zhang[:];
li[1] = zhang[1][:];新增的代码行
print(li is zhang);li[0] = ‘si’;
li[1][1] = 30;
print(li);控制台输出['si',['age',30]]
print(zhang);控制台输出['san',['age',20]]
以上就是第二周我稍有疑惑的地方,还有个通用深复制循环我没有实现出来,QAQ等我理解了再补充上来
jaijia师兄给了我一个模板作为参考,自用//w//方便复习
def my_deepcopy(arr):
rt = [];
for item in arr:
if isinstance(item,list):
rt.append(my_deepcopy(item))
else:
rt.append(item)
return rt
if __name__ == '__main__':
a = [1,2,'3',[4,5,'6']]
b = my_deepcopy(a);
b[3][2] = 'test';
print (a);
print (b);