一个列表意外更改也会改变另一个列表

时间:2015-04-21 23:38:47

标签: python python-2.7

我有一份表单

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

5 个答案:

答案 0 :(得分:8)

  

为什么v会发生变化?

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

如果您想使用两个不同的阵列:

vec = list(v)

答案 1 :(得分:3)

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

如果您不想拥有,则必须制作

from copy import deepcopy
vec = deepcopy(v)

vec = v[:]

答案 2 :(得分:2)

为了节省内存,除非你另有说明,否则vec将指向同一个数组。

像这样复制数组vec=v[:]


在将数据从函数传递给函数时,指向数组而不是复制它的能力非常有用。如果你有这个功能

def foo():
  return someBigArray

你想用someBigArray做点什么

def bar():
  arr = foo()
  processArray(arr)

你不想浪费时间等待程序将someBigArray中的所有数据复制到arr,所以默认行为是给arr一个指向someBigArray的指针。


有人提出了类似的问题 How to clone or copy a list?

答案 3 :(得分:1)

你可以使用

vec=v[:] #but

“Alex Martelli关于这一点的观点(至少在2007年)是这样的,它是一种奇怪的语法,使用它永远没有意义。;)(在他看来,下一个更具可读性)。 “

vec=list(v)

我的意思是Erez的链接......“How to clone or copy a list in Python?

答案 4 :(得分:1)

运行此代码,您将了解变量v的变化原因。

g++-4.x

此代码在我的解释器上打印以下输出:

a = [7, 3, 4]
b = a
c = a[:]
b[0] = 10
print 'a: ', a, id(a)
print 'b: ', b, id(b)
print 'c: ', c, id(c)

如您所见,列出a和b指向相同的内存位置。然而,列表c是完全不同的存储位置。您可以说变量a和b是同一列表的别名。因此,对变量a或b所做的任何更改也将反映在另一个列表中,但不会反映在列表c上 希望这可以帮助! :)