给定一个列表,我试图得到两个元素的随机变化。我定义了一个函数dosopt(),可以实现这一点。然后,我从另一个名为test()的函数调用这个函数。因此,在这个函数“test”中,我试图复制变量x中的初始参数。然后我想对变量“v”应用de function dosopt(),这样它就生成了相同的列表“x”,但是两个元素交换了。当我这么做的时候,x的值也会改变。 我不太擅长编程,所以能帮点忙就好了
from random import randint
import copy as c
def test(other):
x=other[:]
v=dosopt(x)
return x,v
def dosopt(solution):
change=[]
x=0
while x!=1:
i=randint(0,len(solution[0])-2)
j=randint(0,len(solution[0])-2)
if i!=j and i!=j+1 and j!=i+1:
x=1
if i<j:
a=solution[0][i]
b=solution[0][i+1]
c=solution[0][j]
d=solution[0][j+1]
pos=[0,j,b,c]
change.append(pos[:])
solution[0][i+1]=change[0][3]
solution[0][change[0][1]]=change[0][2]
elif i>j:
a=solution[0][j]
b=solution[0][j+1]
c=solution[0][i]
d=solution[0][i+1]
pos=[0,i,b,c]
change.append(pos[:])
solution[0][j+1]=change[0][3]
solution[0][change[0][1]]=change[0][2]
return(solution)
lis=[[0,1,2,3,4,5,6,7,0]]
如我所知,问题出在dosopt函数上,因为我在其他函数上没有这个问题。你知道吗
请忽略无意义的代码行,它们来自以前的代码。你知道吗
这是因为列表是按引用复制的,而不是按值复制的。你知道吗
解决这个问题的最简单方法是使用
copy
模块。你知道吗结果
所以在您的例子中,如果您想复制
x
并保存它,您应该使用v = dosopt(copy.deepcopy(x))
。不过,您应该意识到,这可能非常缓慢,这取决于x
的大小。你知道吗另外,当您稍后使用变量
c
时,您正在隐藏copy as c
的导入。你应该避免这样做。另外,copy
不是一个长的或复杂的名字,所以你不应该给它起别名。别名通常保留在输入内容繁琐或占用大量屏幕空间的情况下,例如import matplotlib.pyplot as plt
。你知道吗相关问题 更多 >
编程相关推荐