2024-05-23 23:44:41 发布
网友
我有一张表格的清单
v = [0,0,0,0,0,0,0,0,0]
在密码里的某个地方
vec=v vec[5]=5
这改变了v和vec:
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会发生变化?
Why does v change at all?
vec和v都是指针。 当对vec=v编码时,将v地址分配给vec。 因此,在v中改变数据也将“改变”vec。
如果要使用两个不同的数组,请使用:
vec = list(v)
Python将vec = v中的两个列表指向同一个内存点。
vec = v
要复制列表,请使用vec=v[:]
vec=v[:]
这可能都是违反直觉的。为什么不将复制列表作为默认行为?考虑一下情况
def foo(): my_list = some_function() # Do stuff with my_list
难道你不希望my_list包含在some_function中创建的完全相同的列表,而不必花时间创建它的副本吗。对于大型列表,复制数据可能需要一些时间。由于这个原因,Python不会在赋值时复制列表。
my_list
some_function
其他注释:
如果你熟悉使用指针的语言。在内部,在生成的汇编语言中,vec和v只是引用列表开始的内存地址的指针。
其他语言已经能够通过使用copy on write来克服我提到的障碍,它允许对象共享内存,直到它们被修改。不幸的是,Python从未实现过这一点。
有关复制列表或进行深度复制的其他方法,请参见How to clone or copy a list?
因为v指向的列表与vec在内存中的列表相同。
如果你不想拥有它,你必须
from copy import deepcopy vec = deepcopy(v)
或者
vec = v[:]
vec和v都是指针。 当对vec=v编码时,将v地址分配给vec。 因此,在v中改变数据也将“改变”vec。
如果要使用两个不同的数组,请使用:
Python将
vec = v
中的两个列表指向同一个内存点。要复制列表,请使用
vec=v[:]
这可能都是违反直觉的。为什么不将复制列表作为默认行为?考虑一下情况
难道你不希望
my_list
包含在some_function
中创建的完全相同的列表,而不必花时间创建它的副本吗。对于大型列表,复制数据可能需要一些时间。由于这个原因,Python不会在赋值时复制列表。其他注释:
如果你熟悉使用指针的语言。在内部,在生成的汇编语言中,
vec
和v
只是引用列表开始的内存地址的指针。其他语言已经能够通过使用copy on write来克服我提到的障碍,它允许对象共享内存,直到它们被修改。不幸的是,Python从未实现过这一点。
有关复制列表或进行深度复制的其他方法,请参见How to clone or copy a list?
因为v指向的列表与vec在内存中的列表相同。
如果你不想拥有它,你必须
或者
相关问题 更多 >
编程相关推荐