在函数中调用函数时保留一个值?

2024-10-01 00:22:02 发布

您现在位置: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]]

如我所知,问题出在dosopt函数上,因为我在其他函数上没有这个问题。你知道吗

请忽略无意义的代码行,它们来自以前的代码。你知道吗


Tags: 函数postestimport元素列表lenreturn
1条回答
网友
1楼 · 发布于 2024-10-01 00:22:02

这是因为列表是按引用复制的,而不是按值复制的。你知道吗

解决这个问题的最简单方法是使用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的大小。你知道吗

另外,当您稍后使用变量c时,您正在隐藏copy as c的导入。你应该避免这样做。另外,copy不是一个长的或复杂的名字,所以你不应该给它起别名。别名通常保留在输入内容繁琐或占用大量屏幕空间的情况下,例如import matplotlib.pyplot as plt。你知道吗

相关问题 更多 >