我是编程新手。我写了一些令我困惑的Python代码。我有一个名为“board”的列表,我创建了一个名为“newlist”的新列表。我使用名为cupdateboard()的函数创建了新列表,该函数将列表,电路板和另一个参数作为输入。我不期待董事会改变,但确实如此。有人可以向我解释为什么董事会已经改变了,以及如何在不改变董事会的情况下创建基于董事会的新板?
def cupdateboard(cmove,lst):
newlst=lst
number=cmove+newlst[cmove]
newlst[cmove]=0
if number<=13:
for i in range(cmove+1,number+1):
newlst[i]+=1
elif number>13 and number<=19:
for i in range(cmove+1,14):
newlst[i]+=1
for i in range(0,number-13):
newlst[i]+=1
elif number>19:
for i in range(cmove+1,14):
newlst[i]+=1
for i in range(0,6):
newlst[i]+=1
for i in range(7,7+(number-19)):
newlst[i]+=1
return newlst
board=[4,4,4,4,4,4,0,4,4,4,4,4,4,0]
cmove=7
newboard=cupdateboard(cmove,board)
print(newboard)
print(board)
input("Press enter to quit")
答案 0 :(得分:3)
在Python中分配可变数据类型会创建数据类型的shallow copy。
换句话说,做
s = [1,2,3]
v = s
v[0] = 200
也会导致s
成为[200, 2, 3]
。
s
的浅表副本意味着v
创建s
的新副本,其元素引用到内存中s
的原始元素 - v[i]
指向原始s[i]
引用的内存位置,而不是指向内存中具有s[i]
副本的新位置。显然,这意味着当您更改v[i]
时,会覆盖内存位置,这样,当s[i]
查看其值时,它会看到一个新值并在被询问时返回该值。
当您执行newlst = lst
并对newlst[i]
进行更改时,就会发生这种情况。你也不小心修改了lst[i]
,因为复制很浅。字典和其他可变对象也会出现同样的问题。 (不可变对象,如字符串,元组等,不会遇到这个问题,因为它们是不可变的。)
要解决此问题,您需要进行深度复制 - 创建s
的新副本,其中所有元素都指向元素的全新值(即不指向原始的相同内存位置{ {1}}的元素,但采用相同的元素,在一个全新的内存位置制作每个元素的副本,并使s
指向新的内存位置。
简单地做
v[i]
应该解决你的问题。