我有以下格式的列表:
v = [0,0,0,0,0,0,0,0,0]
我在代码中的某些地方
vec=v
vec[5]=5
>这会同时改变
v
和vec
:>>> print vec
[0, 0, 0, 0, 0, 5, 0, 0, 0]
>>> print v
[0, 0, 0, 0, 0, 5, 0, 0, 0]
为什么
v
会完全改变?#1 楼
为什么v会根本改变?
vec
和v
都是引用。 />因此,更改vec = v
中的数据也会“更改” v
。如果要具有两个不同的数组,请使用:
#2 楼
因为v指向的内存与vec指向的列表相同。如果您不想拥有该内存,则必须创建一个
from copy import deepcopy
vec = deepcopy(v)
或
vec = v[:]
评论
您不需要浅表的深层副本
–坎宁安(Padraic Cunningham)
15年4月22日在1:42
#3 楼
Python将vec = v
中的两个列表都指向了相同的内存位置。为什么不将复制列表作为默认行为?考虑这种情况 vec=v[:]
您是否不希望
def foo():
my_list = some_function()
# Do stuff with my_list
包含与以下内容完全相同的列表:是在my_list
中创建的,无需花费时间创建它的副本。对于大型列表,复制数据可能需要一些时间。因此,Python不会在分配时复制列表。其他注释:
如果您熟悉使用指针的语言。在内部,在最终的汇编语言中,
some_function
和vec
只是引用列表开始处的内存中地址的指针。共享内存,直到对其进行修改。不幸的是,Python从未实现此功能。有关复制列表或进行深层复制的其他方法,请参见如何克隆或复制列表?
#4 楼
您可以使用vec=v[:] #but
”“ Alex Martelli对此的看法(至少在2007年是这样),它是一个奇怪的语法,使用它没有任何意义曾经。;)(在他看来,下一个更具可读性)。“
vec=list(v)
我的意思是这是Erez的链接...”如何克隆或复制Python中的列表?“
评论
值得注意的是,这种行为不仅限于列表,它也可以在dict对象上观察到,并且如果它们是可变的,则在tuple上也可以观察到。@SimeonVisser我无法提前知道。如果我想使用关键字指针进行搜索,就不会发布该问题。