为何使用list()无法创建新列表?嵌套列表复制异常问题
问题原因:浅拷贝的局限性
你遇到的问题是因为list(route)执行的是浅拷贝操作。route是嵌套列表(列表元素本身也是列表),浅拷贝只会复制外层列表的结构,但里面的每个子列表并没有被真正复制——新的copyRoute里的元素只是原route中子列表的引用,两者指向同一个内存地址的子列表对象。所以当你修改route[0][0]时,本质是修改了那个子列表里的元素,copyRoute因为引用同一个子列表,自然也会同步变化。
解决方案
下面是几种可行的深拷贝方式,能彻底复制嵌套列表的所有内容:
方法1:列表推导式 + 子列表拷贝
直接遍历原列表的每个子列表,单独拷贝每个子列表:
from random import randint def createRoute(): route = [] for horizon in range(8): row = [] for vertical in range(4): row.append(randint(0, 50)) route.append(row) return route def printRoute(list): for i in range(8): for j in range(4): print("%3d" % list[i][j], end=" ") print() # 添加换行让输出更清晰 def main(): route = createRoute() # 用列表推导式拷贝每个子列表 copyRoute = [row.copy() for row in route] route[0][0] = 250 print("原route:") printRoute(route) print("拷贝后的copyRoute:") printRoute(copyRoute) main()
方法2:使用copy模块的deepcopy
如果嵌套结构更复杂(比如多层嵌套),推荐使用copy模块的deepcopy方法,它会递归复制所有层级的对象:
from random import randint import copy def createRoute(): route = [] for horizon in range(8): row = [] for vertical in range(4): row.append(randint(0, 50)) route.append(row) return route def printRoute(list): for i in range(8): for j in range(4): print("%3d" % list[i][j], end=" ") print() def main(): route = createRoute() copyRoute = copy.deepcopy(route) route[0][0] = 250 print("原route:") printRoute(route) print("拷贝后的copyRoute:") printRoute(copyRoute) main()
方法3:用切片拷贝子列表
和方法1原理类似,用切片row[:]创建子列表的拷贝:
copyRoute = [row[:] for row in route]
这几种方法都能让copyRoute成为独立于原route的新列表,修改其中一个不会影响另一个。
内容的提问来源于stack exchange,提问作者NinjaCoder
相关产品推荐
相关产品推荐

