X
是一个2D数组。我想要一个与数组Y
具有相同值的新变量X
。此外,对Y的任何进一步操作都不应影响X的值。
在我看来使用y = x
这么自然。但它不适用于数组。如果我这样做然后改变y,x也会改变。我发现问题可以像这样解决:y = x[:]
但它不适用于2D数组。例如:
x = [[1,2],[3,4]]
y = x[:]
y[0][0]= 1000
print x
返回[ [1000, 2], [3, 4] ]
。如果我将y=x[:]
替换为y = x[:][:]
,也无济于事。
有人知道什么是正确而简单的方法吗?
答案 0 :(得分:57)
使用deepcopy()或copy()是一个很好的解决方案。 对于简单的2D数组情况
y = [row[:] for row in x]
答案 1 :(得分:44)
答案 2 :(得分:9)
对于2D阵列,可以使用 map 功能:
old_array = [[2, 3], [4, 5]]
# python2.*
new_array = map(list, old_array)
# python3.*
new_array = list(map(list, old_array))
答案 3 :(得分:1)
在您的情况下(因为您使用列表列表),您必须使用deepcopy,因为'浅层复制和深层复制之间的区别仅与复合对象(包含其他对象的对象,如列表或类实例): 浅拷贝构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中。 深层复制构造一个新的复合对象,然后递归地将副本插入到原始对象中找到的对象。'
请注意,下面的示例只是为了向您展示一个示例(不要打我太多)如何为1d和2d阵列实现深度复制:
arr = [[1,2],[3,4]]
deepcopy1d2d = lambda lVals: [x if not isinstance(x, list) else x[:] for x in lVals]
dst = deepcopy1d2d(arr)
dst[1][1]=150
print dst
print arr
答案 4 :(得分:0)
我认为np.tile也可能有用
>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
[0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
[[0, 1, 2, 0, 1, 2]]])