0

我正在加载一个文件“data.imputation”,它是 2 维变量'x'。变量'y''x'. 'y'我从(y 是 2D)弹出第一个数组。为什么变化反映在x? (第一个数组 from'x'也被弹出)

ip = open('data.meanimputation','r')
x = pickle.load(ip)
y = x
y.pop(0)

一开始,len(x) == len(y). 即使在之后y.pop(0)len(x) == len(y)。这是为什么?我该如何避免呢?

4

2 回答 2

3

使用y = x[:]而不是y = x. y = x表示两者yx现在都指向同一个对象。

看看这个例子:

>>> x=[1,2,3,4]
>>> y=x
>>> y is x
True          # it means both y and x are just references to a same object [1,2,3,4], so changing either of y or x will affect [1,2,3,4]
>>> y=x[:]     # this makes a copy of x and assigns that copy to y,
>>> y is x     # y & x now point to different object, so changing one will not affect the other.
False

如果 x 是一个列表是列表的列表,那么[:]是没有用的:

>>> x= [[1,2],[4,5]]
>>> y=x[:]   #it makes a shallow copy,i.e if the objects inside it are mutable then it just copies their reference to the y
>>> y is x
False         # now though y and x are not same object but the object contained in them are same 
>>> y[0].append(99)
>>> x
[[1, 2, 99], [4, 5]]
>>> y
[[1, 2, 99], [4, 5]]
>>> y[0] is x[0]
True  #see both point to the same object

在这种情况下,您应该使用copy模块的deepcopy()功能,它会制作对象的非浅拷贝。

于 2012-06-23T19:19:27.187 回答
1

y = x不复制任何东西。它将名称绑定y到 已引用的同一对象x。对裸名的赋值永远不会在 Python 中复制任何内容。

如果你想复制一个对象,你需要明确地复制它,使用你试图复制的对象可用的任何方法。你不说对象x是什么类型的,所以没有办法说你可以如何复制它,但是该copy模块提供了一些适用于多种类型的功能。另请参阅此答案

于 2012-06-23T19:15:08.987 回答