In [190]: a = [1,2,3,4,5]
In [191]: b = a[:3]
In [192]: b[0] = 999
In [193]: a
Out[193]: [1, 2, 3, 4, 5]
In [194]: b
Out[194]: [999, 2, 3]
如果python列表包含子列表,并且您创建了一个浅拷贝,那么您将捕获python列表:
In [197]: a = [[1,2,3],[4,5]]
In [198]: b = a[:]
In [199]: id(a)
Out[199]: 140335437468296
In [200]: id(b)
Out[200]: 140335437417992
In [201]: b[0][0] = 999
In [202]: b
Out[202]: [[999, 2, 3], [4, 5]]
In [203]: a
Out[203]: [[999, 2, 3], [4, 5]]
In [204]: a = [[1,2,3],[4,5]]
In [205]: from copy import deepcopy
In [206]: b = deepcopy(a)
In [207]: b[0][0] = 999
In [208]: b
Out[208]: [[999, 2, 3], [4, 5]]
In [209]: a
Out[209]: [[1, 2, 3], [4, 5]]
“数组自动相互复制”是一个错误的陈述,有几个原因。主要原因是只有一个数组和两个引用该数组的变量名。在
以下是复制numpy数组的三种方法(即创建与之完全相同的另一个数组):
注意切片复制(例如
e = a[:])
将而不是与numpy数组一起工作。在你需要一份复印件:
^{pr2}$b = a
创建一个引用,因此a is b
它们都指向内存中的相同位置,a.copy()
实际上创建了一个新对象。在如果使用basic slicing对数组进行切片,则id将不同,但任何更改都将反映在a和b中,因为使用基本索引时,基本切片生成的所有数组始终是原始数组的视图。Aview是一个数组,它不拥有自己的数据,而是引用另一个数组的数据。所以视图是一个新对象,但内容仍然属于原始数组。在
但是,使用advanced indexing高级索引总是返回数据的副本
这是特定的numpy行为,切片一个常规python平面列表将始终创建一个新列表,其中a中的更改不会反映在b中
如果python列表包含子列表,并且您创建了一个浅拷贝,那么您将捕获python列表:
您需要制作一个copy.deepcopy:
你可以像这样使用复制模块
这与这样一个事实有关:当您执行
b = a
时,您将a
的引用分配给b
。在关于这个问题的更多信息可以在这个答案中找到:How to clone or copy a list?
相关问题 更多 >
编程相关推荐