鱼C论坛

 找回密码
 立即注册
查看: 2035|回复: 2

.copy复制新列表后改动新列表旧列表也改变了。

[复制链接]
发表于 2020-12-10 19:26:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用切片方法或者.copy()方法都尝试过,用短的列表如list=[1,2,3,4] list1 =list.copy()时确实两个列表是分开的,改动一个另一个不变,但我在读取文件存入列表时同样用这个方法将data列表复制出一个newdata列表,改动newdata后data还是也改变了。请问这是什么原因呢?如何才能避免改动data列表呢?
  1. import cv2
  2. #打开标签
  3. #这版尝试保存整张图分成多张图后的标签和图片
  4. f = open('.\\label\\000006.txt')
  5. f1 = open('10000061.txt','w+')
  6. f2 = open('10000062.txt','w+')
  7. f3 = open('10000063.txt','w+')
  8. #读取标签中目标的坐标
  9. data = []
  10. newdata = []
  11. le =[]
  12. ri=[]
  13. for line in f.readlines():
  14.         temp = line.split()
  15.         data.append(temp)
  16. newdata = data.copy()  #这里复制了新列表
  17. #这一段是裁剪图片的代码
  18. img = cv2.imread('000006.png',1)
  19. a=0
  20. b = 370
  21. height, width, depth = img.shape

  22. for i in range(0,len(data)):
  23.         xmin = int(float(data[i][1])*width - 0.5*float(data[i][3])*width)
  24.         le.append(xmin)
  25.         xmax = int(float(data[i][1])*width + 0.5*float(data[i][3])*width)
  26.         ri.append(xmax)


  27.         if b in range(le[i],ri[i]):
  28.                 b = ri[i] + 10


  29.         else:
  30.                 pass

  31.         if i == len(data)-1:
  32.                 dst1 = img[0:height, a:b]
  33.                 #换成保存图片
  34.                 cv2.imwrite('.\\save\\10000001'+'.png',dst1)
  35. print(data)#这里打印出来data还是不变的
  36. for i in range(0,len(data)):
  37.         newdata[i][1]=(((le[i]+ri[i])/2)-a)/(b-a)
  38.         print(data)#这里打印出来data就开始变了
  39.         newdata[i][3]=float(newdata[i][3])*width/(b-a)
  40. for j in range(0,len(ri)):
  41.         if ri[j] in range(a,b):
  42.                 for p in range(len(newdata[j])):
  43.                         f1.write(str(newdata[j][p])+' ')
  44.                 f1.write('\n')
  45. f1.close()
  46. print(newdata)#这里打印出来newdata和data的数值完全一样了。
  47. print(data)
  48. a = b
  49. b = b +370
  50. le =[]
  51. ri=[]
  52. for i in range(0,len(data)):
  53.         xmin = int(float(data[i][1])*width - 0.5*float(data[i][3])*width)
  54.         le.append(xmin)
  55.         xmax = int(float(data[i][1])*width + 0.5*float(data[i][3])*width)
  56.         ri.append(xmax)

  57.         if b in range(le[i],ri[i]):
  58.                 b = ri[i] + 10


  59.         else:
  60.                 pass

  61.         if i == len(data)-1:
  62.                 dst1 = img[0:height, a:b]
  63.                 #换成保存图片
  64.                 cv2.imwrite('.\\save\\10000002'+'.png',dst1)
  65. for i in range(0,len(data)):
  66.         newdata[i][1]=(((le[i]+ri[i])/2)-a)/(b-a)
  67.         newdata[i][3]=float(data[i][3])*width/(b-a)
  68. for j in range(0,len(ri)):
  69.         if ri[j] in range(a,b):
  70.                 for p in range(len(newdata[j])):
  71.                         f2.write(str(newdata[j][p])+' ')
  72.                 f2.write('\n')
  73. f2.close()
  74. a = b
  75. b = b +370
  76. le =[]
  77. ri=[]
  78. for i in range(0,len(data)):
  79.         xmin = int(float(data[i][1])*width - 0.5*float(data[i][3])*width)
  80.         le.append(xmin)
  81.         xmax = int(float(data[i][1])*width + 0.5*float(data[i][3])*width)
  82.         ri.append(xmax)

  83.         if b in range(le[i],ri[i]):
  84.                 b = ri[i] + 10


  85.         else:
  86.                 pass

  87.         if i == len(data)-1:
  88.                 dst1 = img[0:height, a:b]
  89.                 #换成保存图片
  90.                 cv2.imwrite('.\\save\\10000003'+'.png',dst1)
  91. for i in range(0,len(data)):
  92.         newdata[i][1]=(((le[i]+ri[i])/2)-a)/(b-a)
  93.         newdata[i][3]=float(data[i][3])*width/(b-a)
  94. for j in range(0,len(ri)):
  95.         if ri[j] in range(a,b):
  96.                 for p in range(len(newdata[j])):
  97.                         f3.write(str(newdata[j][p])+' ')
  98.                 f3.write('\n')
  99. f3.close()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-10 19:42:44 | 显示全部楼层
尝试用id()查看两个列表是不是相同的发现
id(data)
1992971165320
id(newdata)
1992971165192
明明就是两个不同地址的列表啊!为什么改了一个另一个会变啊!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 19:52:15 | 显示全部楼层
明白了,是浅拷贝和深拷贝的问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-30 14:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表