python-浅拷贝&深拷贝
2021-05-14 03:30
标签:delete not remove 自带 有一个 pre 这一 ini pen 1、循环删除列表,为啥结果不正确? 解决方案: 2、浅拷贝&深拷贝 3、实例?? python-浅拷贝&深拷贝 标签:delete not remove 自带 有一个 pre 这一 ini pen 原文地址:https://www.cnblogs.com/tour8/p/13125885.html 1 a = [1,1,2,3,4,5]#原始下标为0,1,2,3,4,5
2
3 # 第一次循环,处理下标0,即1,满足条件,删除,结果[1,2,3,4,5],此时下标为0,1,2,3,4
4 # 第二次循环,处理下标1,即2,不满足
5 # 第三次循环,处理下标2,即3,满足条件,删除,结果[1,2,4,5],此时下标为 0,1,2,3
6 # 第四次循环,处理下标3,即5,满足条件,删除,结果[1,2,4]
7
8 # 结果:[1,2,4],不符合预期,为啥还有一个1??见执行过程
9 for i in a:
10 if i % 2 != 0:
11 a.remove(i)
12 #print(a)
13
14 print(a) # 循环删list会导致下标错乱
1 a = [1,1,2,3,4,5]
2
3 # 解决方法
4 a2 = [1,1,2,3,4,5]
5
6 for i in a2:
7 if i % 2 != 0:
8 a.remove(i)
9 #print(a)
10
11 print(a) # 结果[[2, 4]]
1 a = [1,1,2,3,4,5]
2 a2 = a # 内存地址一样,肯定是浅拷贝
3 print(‘a‘,id(a))
4 print(‘a2‘,id(a2))
5
6 a3 = a.copy() # 浅拷贝:list自带的copy方法,内部地址不一样,不一定是深拷贝
7 print(‘a‘,id(a))
8 print(‘a3‘,id(a3))
9
10 a5 = copy.copy(a) # 浅拷贝
11 print(‘a‘,id(a))
12 print(‘a5‘,id(a5))
13
14 a4 = copy.deepcopy(a) # 深拷贝,只有这一种拷贝方式是深拷贝
15 print(‘a‘,id(a))
16 print(‘a4‘,id(a4))
1 class User:
2 def __init__(self,id,status):
3 self.id = id
4 self.status = status
5
6 users = []
7 u_fail_count = 0
8 for i in range(20):
9 u = User(i,random.choice([‘fail‘,‘success‘]))
10 if u.status == ‘fail‘:
11 u_fail_count += 1
12 users.append(u)
13 print(‘失败的个数‘,u_fail_count)
14 print(‘成功的个数‘,20 - u_fail_count)
15
16
17 def delete_item(items):
18 # items2 = items # 浅拷贝
19 items2 = copy.deepcopy(items) # 深拷贝
20 for item in items2:
21 if item.status == ‘fail‘:
22 items.remove(item) # ???ValueError: list.remove(x): x not in list
23 return items
24
25 result = delete_item(users)
26 print(len(result))