更改一个列表会意外地更改另一个列表,

2024-05-23 23:44:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张表格的清单

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会发生变化?


Tags: 密码地方表格printvec
3条回答

Why does v change at all?

vec和v都是指针。 当对vec=v编码时,将v地址分配给vec。 因此,在v中改变数据也将“改变”vec。

如果要使用两个不同的数组,请使用:

vec = list(v)

Python将vec = v中的两个列表指向同一个内存点。

要复制列表,请使用vec=v[:]


这可能都是违反直觉的。为什么不将复制列表作为默认行为?考虑一下情况

def foo():
    my_list = some_function()
    # Do stuff with my_list

难道你不希望my_list包含在some_function中创建的完全相同的列表,而不必花时间创建它的副本吗。对于大型列表,复制数据可能需要一些时间。由于这个原因,Python不会在赋值时复制列表。



其他注释:

  • 如果你熟悉使用指针的语言。在内部,在生成的汇编语言中,vecv只是引用列表开始的内存地址的指针。

  • 其他语言已经能够通过使用copy on write来克服我提到的障碍,它允许对象共享内存,直到它们被修改。不幸的是,Python从未实现过这一点。

  • 有关复制列表或进行深度复制的其他方法,请参见How to clone or copy a list?

因为v指向的列表与vec在内存中的列表相同。

如果你不想拥有它,你必须

from copy import deepcopy
vec = deepcopy(v)

或者

vec = v[:]

相关问题 更多 >