我有以下格式的列表:

v = [0,0,0,0,0,0,0,0,0]


我在代码中的某些地方

vec=v
vec[5]=5


>这会同时改变vvec

>>> print vec
[0, 0, 0, 0, 0, 5, 0, 0, 0]
>>> print v
[0, 0, 0, 0, 0, 5, 0, 0, 0]


为什么v会完全改变?

评论

值得注意的是,这种行为不仅限于列表,它也可以在dict对象上观察到,并且如果它们是可变的,则在tuple上也可以观察到。
@SimeonVisser我无法提前知道。如果我想使用关键字指针进行搜索,就不会发布该问题。

#1 楼


为什么v会根本改变?


vecv都是引用。 />因此,更改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_functionvec只是引用列表开始处的内存中地址的指针。共享内存,直到对其进行修改。不幸的是,Python从未实现此功能。
有关复制列表或进行深层复制的其他方法,请参见如何克隆或复制列表?


#4 楼

您可以使用

vec=v[:] #but


”“ Alex Martelli对此的看法(至少在2007年是这样),它是一个奇怪的语法,使用它没有任何意义曾经。;)(在他看来,下一个更具可读性)。“

vec=list(v)


我的意思是这是Erez的链接...”如何克隆或复制Python中的列表?“

#5 楼

运行此代码,您将了解为什么变量v会发生变化。 />如您所见,列出的a和b指向相同的内存位置。而列表c完全是一个不同的存储位置。您可以说变量a和b是同一列表的别名。因此,对变量a或b所做的任何更改也将反映在另一个列表中,但不会在列表c中反映出来。希望这会有所帮助! :)