我正在加载一个文件“data.imputation”,它在变量'x'
中是2维的。变量'y'
是'x'
的副本。我从'y'
弹出第一个数组(y是2D)。为什么更改会反映在x
上? (也会弹出'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)
之后。这是为什么?我怎么能避免它?
答案 0 :(得分:3)
使用y = x[:]
代替y = x
。 y = x
表示y
和x
现在都指向同一个对象。
看一下这个例子:
>>> 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()
函数,它会生成对象的非浅层副本。
答案 1 :(得分:1)
y = x
不会复制任何内容。它将名称y
绑定到x
已引用的同一对象。对裸名称的赋值永远不会在Python中复制任何内容。
如果要复制对象,则需要使用您尝试复制的对象可用的任何方法显式复制它。您没有说明对象x
是什么类型,因此没有办法说明如何复制它,但copy
模块提供了一些适用于多种类型的函数。另请参阅this answer。