[:]切片只能制作列表的浅表副本吗?

Hel*_*lad 3 python numpy

我从这个[:]副本中经历了一些特殊的错误.

文档[:]只是一个浅薄的副本,但似乎:

a = [1,2,3]
id(a)
3071203276L
b=a[:]
id(b)
3071234156L
Run Code Online (Sandbox Code Playgroud)

id(a)不等于id(b); 怎么只是一个浅的副本?

特殊情况:

import numpy as np
import random
a = np.array([1,2,3])
b=a[:]
random.shuffle(a)
Run Code Online (Sandbox Code Playgroud)

b 相应地改变.

Ano*_*sse 5

Numpy回答:

numpy中的数组是后备存储上的视图/索引.

您可以复制视图,而无需复制后备存储...

a=numpy.array([1,2,3,4])
b=a[:] # copy of the array ("view" or "index"), not the storage
b.shape=(2,2)
print a
# [1 2 3 4]
print b
# [[1 2]
#  [3 4]]
b *= 2
print a
# [2 4 6 8]
print b
# [[2 4]
#  [6 8]]
Run Code Online (Sandbox Code Playgroud)

看看改变b如何影响?然而他们仍然有不同的形状.认为它们是数据的视图 ; 并且该b=a[:]行仅复制了此视图.我甚至可以修改它的形状b.因为它只是数据的索引,所以说明列和行位于内存中.

如果您想要numpy中的后备存储副本,请使用a.copy().