我有一份表单
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
会发生变化?
答案 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上 希望这可以帮助! :)