在python中复制数组并操作数组

在python中复制数组并操作数组,python,multidimensional-array,python-2.7,Python,Multidimensional Array,Python 2.7,我正在加载一个文件“data.imputation”,该文件在变量'x'中是二维的。变量'y'是'x'的副本。我从'y'弹出第一个数组(y是2D)。为什么更改会反映在x上?(同时弹出'x'中的第一个数组) 开始时,len(x)==len(y)。即使在y.pop(0)之后,len(x)==len(y)。为什么呢?我怎样才能避免它呢?y=x不会复制任何东西。它将名称y绑定到已由x引用的同一对象。对裸名称的赋值不会复制Python中的任何内容 如果要复制对象,则需要显式地复制它,使用可用于要复制的对象

我正在加载一个文件“data.imputation”,该文件在变量
'x'
中是二维的。变量
'y'
'x'
的副本。我从
'y'
弹出第一个数组(y是2D)。为什么更改会反映在
x
上?(同时弹出
'x'
中的第一个数组)


开始时,
len(x)==len(y)
。即使在
y.pop(0)
之后,
len(x)==len(y)
。为什么呢?我怎样才能避免它呢?

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


如果要复制对象,则需要显式地复制它,使用可用于要复制的对象的任何方法。您没有说明对象
x
是什么类型的,因此无法说明如何复制它,但是
copy
模块提供了一些适用于多种类型的功能。另请参见。

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


如果要复制对象,则需要显式地复制它,使用可用于要复制的对象的任何方法。您没有说明对象
x
是什么类型的,因此无法说明如何复制它,但是
copy
模块提供了一些适用于多种类型的功能。另请参见。

使用
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()
函数,它对对象进行非浅层复制。

使用
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()
函数,它对对象进行非浅拷贝。

这取决于对象
x
的类型。如果
x
提供了这样一种方法(例如,Python字典就提供了这种方法),那么它就可以工作。您还可以尝试导入副本,然后尝试复制。但是,只有当x被设置为以这种方式复制时,这种方法才会起作用。Python中没有通用的“复制任何东西”的方法;你需要知道你在复制什么样的东西,并知道如何复制它。x是一个列表。例如x=[[1,2],[4,5]]如果是这样的列表列表,则需要使用
copy.deepcopy(x)
。读取。这取决于对象的类型
x
。如果
x
提供了这样一种方法(例如,Python字典就提供了这种方法),那么它就可以工作。您还可以尝试导入副本,然后尝试复制。但是,只有当x被设置为以这种方式复制时,这种方法才会起作用。Python中没有通用的“复制任何东西”的方法;你需要知道你在复制什么样的东西,并知道如何复制它。x是一个列表。例如x=[[1,2],[4,5]]如果是这样的列表列表,则需要使用
copy.deepcopy(x)
。读,谢谢。它起作用了。你能解释一下发生了什么事吗?区别是什么呢?y=list(x)更容易理解语法,意思与y=x[:]@lostboy_19相同。看起来你的列表是一个列表列表,所以也添加了一些解释。谢谢。它起作用了。你能解释一下发生了什么事吗?区别是什么?y=list(x)更容易理解语法,意思与y=x[:]@lostboy_19相同。看起来您的列表是一个列表列表,所以也添加了一些解释。