当我在函数内调用函数时保持一个值?

时间:2017-11-13 18:18:24

标签: python

给定一个列表,我试图随机改变两个元素。我定义了一个函数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]]

正如我所知,问题在于doso​​pt函数,因为我没有其他函数的这个问题。

请忽略无意义的代码行,它们来自之前的代码。

1 个答案:

答案 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)时非常繁琐。