gpt4 book ai didi

python - 按值复制变量而不是引用

转载 作者:行者123 更新时间:2023-12-03 23:53:43 24 4
gpt4 key购买 nike

对 python 来说相当新,并且努力实现变量的值副本。有一种算法可以递归调用另一个但没有得到所需的值,因为我认为在以下代码中将一个变量分配给另一个变量时使用了引用:

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
我想拥有 深度行动 相同的值深度 但相反,我认为我指向相同的内存位置,因此在调用 limSearch 时,我会使用深度中传递给方法的任何值而不是我想要使用的另一个值来执行它,因为我随后会增加它。
我对吗?任何帮助都感激不尽。
编辑:我知道 limSearch 算法的解决方案是深度 = 35,但希望这个其他算法检查解决方案是否存在给定深度增量,所以,如果我用 depthl = 40 和 depthi 2 调用搜索,它应该运行 limSearch首先传入深度值 2,然后是 4、6、8、10 .. 直到达到 36,然后它应该找到它在 35 中的解决方案原因,但它不起作用,而是我得到一个 sol=None在所有情况下,就好像我用其他值调用 limSearch 一样。

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


我希望像这样的调用在调用 limSearch 的循环中,直到它达到该算法中的解决方案,在这种情况下深度 = 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 循环将不再执行,返回我想要的解决方案。
我调用此函数的上下文如下:
if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
通过用户输入读取所有值后。
depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))

最佳答案

通常,如果您对引用和复制数据有疑虑,copy module将为您提供所需的细粒度复制控制。
copy.copy保证执行“浅拷贝”,其中列表将包含对旧数据的引用,但将是新列表(或其他容器)。
copy.deepcopy将为您提供一个“深拷贝”,其中元素本身将被复制。

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

IE:

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

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

如果您不复制泛型类型,则应该复制模块。任意类都可以实现方法 __copy____deepcopy__ ( more info ) 来制作对象的副本,并且是确保按照用户期望的方式制作副本的最 Pythonic 方式。

编辑:
对于那些会编辑帖子以删除我回复的第一人称声音的人;不要那样做。我回答 OP 而不是写技术期刊,可读性很重要。我承认我的回答是不正确的,但只是因为我建议使用 int不需要时的类型构造函数(尽管结果是相同的,但它不是 Pythonic)。我在这里包含了一些关于不可变数据类型的内容,但我不认为说“ int 是不可变的”是一个充分的答案,因为显式优于隐式。话虽如此,不可变类型和标准库的知识 copy模块可能是最完整的响应。

关于python - 按值复制变量而不是引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53214361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com