python-浅拷贝&深拷贝

2021-05-14 03:30

阅读:729

标签:delete   not   remove   自带   有一个   pre   这一   ini   pen   

1、循环删除列表,为啥结果不正确?

 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]]

 

 

2、浅拷贝&深拷贝

  • 浅拷贝:dict.copy()也是浅拷贝
 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))

 

3、实例??

 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))

 

python-浅拷贝&深拷贝

标签:delete   not   remove   自带   有一个   pre   这一   ini   pen   

原文地址:https://www.cnblogs.com/tour8/p/13125885.html


评论


亲,登录后才可以留言!