按值复制变量而不是引用

2024-05-16 18:11:59 发布

您现在位置:Python中文网/ 问答频道 /正文

对于python来说,这是一个全新的概念,并且正在努力实现一个变量的值拷贝。有一个算法,递归地调用另一个变量,但没有得到所需的值,因为我认为在下面的代码中将一个变量分配给另一个变量时,im使用了引用:

def search(problem, strategy, depthl, depthi, pruning):
    depthact = depthi
    sol = None
    while(not sol and depthact <= depthl):
        sol = limSearch(problem, strategy, depthact, pruning)
        depthact += depthi
    return sol

我想在depthact中使用与depthi相同的值,但是我认为我指向同一个内存位置,因此在调用limSearch时,我使用传递给depthi中的方法的任何值,而不是另一个值,我想使用它,因为它是递增的它。在

我说得对吗?任何帮助都将不胜感激。在

编辑:我知道limSearch算法的解是在depth=35中,但希望这个其他算法检查是否存在给定深度增量的解,因此,如果我使用depthl=40和depthi为2调用search,它应该首先通过depthact值2运行limSearch,然后再传递4、6、8、10。。直到它达到36,然后它应该找到解决方案,因为它在35,但它不起作用,相反,我得到一个sol=None在所有情况下,就像我用其他值调用limSearch一样。在

def search(problem, strategy, 40, 2, pruning):

我希望像这样的调用在循环中调用limSearch,直到它在该算法中得到一个解,在本例中是depth=35。所以我的预期结果是:

sol = limSearch(problem, strategy, 2, pruning)

sol = limSearch(problem, strategy, 4, pruning)

sol = limSearch(problem, strategy, 6, pruning)

。。。在

sol = limSearch(problem, strategy, 36, pruning)

在最后一次迭代中,sol不是none,然后while循环将不再执行,返回给我所需的解决方案。在

我调用此函数的上下文如下:

^{pr2}$

在通过用户输入读取所有值之后。在

depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))

Tags: 算法nonesearchdef解决方案problemdepthstrategy
1条回答
网友
1楼 · 发布于 2024-05-16 18:11:59

一般来说,如果您关心引用和复制数据,copy module将为您提供所需的细粒度复制控制。在

copy.copy保证执行“浅层复制”,其中列表将包含对旧数据的引用,但将是一个新列表(或其他容器)。在

copy.deepcopy将为您提供一个“深度复制”,其中元素本身将被复制。在

但是在本例中,您有一个简单的类型int,并且是不可变的,因此每当值发生更改时,都会创建一个新实例。(这比不可变对象的情况要复杂一些,但关键是如果使用的是简单类型,赋值运算符=将不会修改已分配的那些symple类型的其他实例。)

即:

a = 42
b = a
b +=1
print(a)
print(b)

这将打印“42”和“43”,表明修改b不会修改a

如果不复制泛型类型,则应复制模块。任意类可以实现方法__copy____deepcopy__more info)来复制对象,这是确保以用户期望的方式生成副本的最python方法。在

编辑: 那些会编辑帖子以删除我回应的第一人称声音的人,不要这样做。我回答了作业,而不是写技术期刊,可读性很重要。我承认我的回答是不正确的,但只是因为我建议在不必要的时候使用int类型构造函数(尽管结果是一样的,但它不是pythonic)。我在这里介绍了不可变数据类型,但我不认为说“int是不可变的”是一个足够的答案,因为显式比隐式好。尽管如此,了解不可变类型和标准库copy模块可能是最完整的响应。在

相关问题 更多 >