此问题已在此处找到答案:
分配后列表意外更改。这是为什么?我如何预防((22个答案)
两年前关闭。
我有一张表格的清单
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
有什么变化吗?
此问题已在此处找到答案:
分配后列表意外更改。这是为什么?我如何预防((22个答案)
两年前关闭。
我有一张表格的清单
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
有什么变化吗?
5条答案
按热度按时间au9on6nz1#
为什么v会改变?
vec
及v
都是参考资料。编码时
vec = v
你分配v
地址vec
. 因此,更改中的数据v
也会“改变”vec
.如果要使用两个不同的阵列,请使用:
uqdfh47h2#
因为v指向与vec在内存中相同的列表。
如果你不想拥有它,你必须做出选择
或
whitzsjs3#
python将这两个列表都指向
vec = v
到同一个记忆点。要复制列表,请使用
vec=v[:]
这一切似乎都违反直觉。为什么不将复制列表作为默认行为?考虑形势你不想要吗
my_list
包含在中创建的完全相同的列表some_function
而且不必花时间创建它的副本。对于大型列表,复制数据可能需要一些时间。由于这个原因,python不会在赋值时复制列表。杂项说明:
如果您熟悉使用指针的语言。在内部,使用生成的汇编语言,
vec
及v
只是引用列表开始的内存地址的指针。其他语言已经能够克服我提到的障碍,通过使用写时复制,允许对象在修改之前共享内存。不幸的是,python从未实现过这一点。
有关复制列表或进行深度复制的其他方法,请参见如何克隆或复制列表?
qyzbxkaa4#
你可以用
“alex martelli(至少在2007年)对此的看法是,这是一种奇怪的语法,使用它是没有意义的。”(在他看来,下一个更具可读性。”
我是说那是埃雷斯的联系……”如何在python中克隆或复制列表?”
a11xaf1n5#
运行这段代码,您将了解变量v发生变化的原因。
此代码在我的解释器上打印以下输出:
如您所见,列表a和b指向相同的内存位置。然而,列表c是一个完全不同的内存位置。可以说变量a和b是同一列表的别名。因此,对变量a或b所做的任何更改都会反映在其他列表中,但不会反映在列表c中(希望这有帮助!)