给定一个列表,我试图随机改变两个元素。我定义了一个函数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函数,因为我没有其他函数的这个问题。
请忽略无意义的代码行,它们来自之前的代码。
答案 0 :(得分:0)
这是因为列表是通过引用复制的,而不是按值复制的。
解决此问题的最简单方法是使用copy
模块。
import copy
my_list = ["a", "b", "c"]
same_list = my_list
new_list = copy.deepcopy(my_list)
same_list[0] = "test"
my_list[1] = "something"
new_list[0] = "hello"
print(my_list)
print(same_list)
print(new_list)
结果
['test', 'something', 'c']
['test', 'something', 'c']
['hello', 'b', 'c']
因此,如果您要复制x
并保存,则应使用v = dosopt(copy.deepcopy(x))
。您应该知道,这可能会非常慢,具体取决于x
的大小。
此外,当您稍后使用变量copy as c
时,您正在隐藏导入c
的内容。你应该避免这样做。另外,copy
不是一个冗长或复杂的名称,因此您不应该对其进行别名处理。别名通常保留用于在屏幕上输入或占用大量空间(例如import matplotlib.pyplot as plt
)时非常繁琐。