jup*_*can 7 python variables copy reference
对于 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
Run Code Online (Sandbox Code Playgroud)
我希望在深度行为中具有与深度相同的值,但我认为我指向相同的内存位置,因此在调用limSearch时,我使用传递给深度方法的任何值来执行此操作,而不是我使用的另一个值想要使用,因为我然后增加了它。
我对吗?任何帮助都感激不尽。
编辑:我知道 limSearch 算法的解决方案是深度 = 35,但希望其他算法检查是否存在给定深度增量的解决方案,因此,如果我使用深度l = 40 和深度 2 调用搜索,它应该运行 limSearch 首先传入深度值 2,然后是 4、6、8、10.. 直到达到 36,然后它应该找到解决方案,因为它在 35 中,但它不起作用,而是我得到一个 sol=在所有情况下都没有,就像我用其他值调用 limSearch 一样。
def search(问题, 策略, 40, 2, 剪枝):
我希望像这样的调用处于调用 limSearch 的循环中,直到它达到该算法中的解决方案(在本例中深度= 35)。所以我的预期结果是:
sol = limSearch(问题, 策略, 2, 剪枝)
sol = limSearch(问题, 策略, 4, 剪枝)
sol = limSearch(问题, 策略, 6, 剪枝)
...
sol = limSearch(问题, 策略, 36, 剪枝)
在最后一次迭代中 sol 不会为 none,然后 while 循环将不再执行,返回我所需的解决方案。
我调用该函数的上下文如下:
if(strategy == 3): sol = search(p, strategy, depthl, depthi, pruning)
else: sol = limSearch(p, strategy, depthl, pruning)
Run Code Online (Sandbox Code Playgroud)
读取用户输入的所有值后。
depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))
Run Code Online (Sandbox Code Playgroud)
一般来说,如果您担心引用和复制数据,复制模块将为您提供您正在寻找的细粒度复制控制。
copy.copy保证执行“浅复制”,其中列表将包含对旧数据的引用,但将是新列表(或其他容器)。
copy.deepcopy将为您提供一个“深层复制”,其中元素本身将被复制。
但在这种情况下,您有一个简单的类型int并且是不可变的,因此每当值更改时都会创建一个新实例。(这比不可变对象要复杂一些,但重点是,如果您使用简单类型,则赋值运算符=不会修改您已分配的那些简单类型的其他实例。)
IE:
a = 42
b = a
b +=1
print(a)
print(b)
Run Code Online (Sandbox Code Playgroud)
这会打印“42”和“43”,表明修改 b 不会修改 a。
如果您不复制泛型类型,则应该复制模块。任意类可以实现方法__copy__和__deepcopy__(更多信息)来制作对象的副本,并且是确保按照用户期望的方式制作副本的最 Pythonic 方式。
编辑:致那些愿意编辑帖子以删除我回复的第一人称声音的人;不要那样做。我是在回答OP而不是写技术期刊,可读性很重要。我承认我的答案是不正确的,但只是因为我建议在不必要时使用int类型构造函数(尽管结果是相同的,但它不是pythonic)。我在这里包含了有关不可变数据类型的内容,但我不认为说“int是不可变的”是一个足够的答案,因为显式比隐式更好。话虽如此,不可变类型和标准库copy模块的知识可能是最完整的回应。