09_Python深拷贝、浅拷贝

一、循环列表,删除其中的元素

l1 = [1,2,3,4,5,6,7]  循环删除奇数位元素

1.正序循环删除,会出现越界情况,所以采用倒叙的方式删除

1 l1 = [1,2,3,4,5,6,7]
2 for i in range(len(l1) - 1,-1,-1):
3     if i % 2 == 1:
4         l1.pop(l1[i])
5 
6 print(l1)

二、循环字典,删除其中的元素

如果循环删除的话,编译器会报  RuntimeError: dictionary changed size during iteration

1 #错误代码
2 #dic = {'k1':'zhangsan','k2':'lisi','k3':'wangwu','name':'xiaoming'}  删除带k的key
3 dic = {'k1':'zhangsan','k2':'lisi','k3':'wangwu','name':'xiaoming'}
4 
5 for i in dic:
6     if 'k' in i:
7         del dic[i]
8 
9 print(dic)

真确的方式,是把key放到一个列表中,然后根据列表元素进行删除

 1 #正确的代码
 2 dic = {'k1':'zhangsan','k2':'lisi','k3':'wangwu','name':'xiaoming'}
 3 l1 = []
 4 for i in dic:
 5     if 'k' in i:
 6         l1.append(i)
 7 
 8 for i in l1:
 9     del dic[i]
10 
11 print(dic)

三、深拷贝、浅拷贝

浅拷贝

3.1赋值就是指向同一块内存空间

str是不可变类型,所以当修改的时候会替换旧的对象,产生一个新的地址。

str1 = 'zhangsan'
str2 = str1

#两个地址相同
str1 = 'lisi'  
print(id(str1))
print(id(str2))

3.2列表拷贝

l1 = [1,2,3,4]
l2 = l1.copy()
l1.append('5')

print(l1,id(l1))
print(l2,id(l2))

 3.3列表嵌套拷贝

l1 = [1,2,[44,55,66],3,4]
l2 = l1.copy()
l1[2].append('5')

print(l1,id(l1))
print(l2,id(l2))

对于浅拷贝,第一层是独立的内存块,从第二层嵌套开始,都是指向同一个内存地址,一变都变

l1 = [1,2,[44,55,66],3,4]
l2 = l1.copy()
l1[2].append('5')

print(l1,id(l1))
print(l2,id(l2))
print(l1,id(l1[2]))
print(l2,id(l2[2]))

深拷贝

对于深拷贝来说,无论多少层,在内存中都是两个独立的内存块。

import copy

l1 = [1,2,[44,55,66],3,4]
l2 = copy.deepcopy(l1)
l1[2].append('5')

print(l1,id(l1))
print(l2,id(l2))
print(l1,id(l1[2]))
print(l2,id(l2[2]))

 

posted @ 2018-01-29 18:34  短毛兔  阅读(195)  评论(0编辑  收藏  举报