【发布时间】:2015-02-22 03:33:36
【问题描述】:
我遇到了来自这个[:] 副本的特殊错误。
The docs say [:] 只做一个浅拷贝,但似乎:
a = [1,2,3]
id(a)
3071203276L
b=a[:]
id(b)
3071234156L
id(a)不等于id(b);那怎么只是一个浅拷贝?
特例:
import numpy as np
import random
a = np.array([1,2,3])
b=a[:]
random.shuffle(a)
b相应变化。
【问题讨论】:
-
a 和 b 的 id 与人们对副本的期望不同。有什么问题?
-
它是浅拷贝,因为深拷贝很昂贵——而且通常不受欢迎。
-
Slice 是浅拷贝。但无论是浅层还是深层,顶层对象始终是一个副本。
-
见下文:
id()无法区分深拷贝和浅拷贝。仅复制与非复制 (b=a; print id(a), id(b))。 -
Numpy 提出了一个不同的问题。 Numpy 切片意味着您只是在复制 index,而不是后备存储。您甚至可以通过这种方式更改数组的形状。它们被设计成看起来像 python 列表,但实际上并非如此。