是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
我希望在 depthact 中具有与 depthi 相同的值,但我认为我指向相同的内存位置,因此在调用 limSearch 我会使用传递给 depthi 中方法的任何值来执行此操作,而不是我想使用的另一个值,因为我随后将其递增。
我是对的吗?任何帮助将不胜感激。
编辑:我知道limSearch算法的解决方案是在depth = 35中,但是希望此其他算法检查是否存在针对给定深度增量的解决方案,所以,如果我用depthl调用search = 40,深度为2,则应运行limSearch,首先将depth2传递给depthact,然后传递4、6、8、10。直到达到36,然后应找到其在35中的解决原因,但不起作用,而是我在所有情况下都得到sol = None,就像我用其他值调用limSearch一样。
我希望这样的调用在循环中调用limSearch,直到它到达该算法的解决方案为止(在这种情况下,深度为35)。所以我的预期结果是:def搜索(问题,策略,40、2,修剪):
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)
在通过用户输入读取所有值之后。
depthl = int(input('depth: '))-1
if(strategy == 3): depthi = int(input('depth increment: '))
答案 0 :(得分:0)
通常,如果您对参考和复制数据有疑问,则copy module将为您提供所需的细粒度复制控件。
copy.copy
确保进行“浅表复制”,其中列表将包含对旧数据的引用,但将是新列表(或其他容器)。
copy.deepcopy
将为您提供一个“深层复制”,将在其中复制元素本身。
但是,在这种情况下,您具有简单的类型int
并且是不可变的,因此,只要更改值,就会创建一个新实例。 (这比不可变对象要复杂一些,但要点是,如果您使用的是简单类型,则赋值运算符=
不会修改已分配的那些符号类型的其他实例。)< / p>
即:
a = 42
b = a
b +=1
print(a)
print(b)
这将显示“ 42”和“ 43”,表明修改b不会修改a。
如果不复制泛型,则应复制模块。任意类可以实现方法__copy__
和__deepcopy__
(more info)来制作对象的副本,这是确保按用户期望的方式制作副本的最有效的方法。
编辑:
对于那些会编辑帖子以消除我的回复的第一人称声音的人;不要那样做。我回答OP,不写技术期刊,并且可读性很重要。我接受我的答案是错误的,但只有在没有必要的情况下,我才建议使用int
类型的构造函数(尽管结果是相同的,但它不是 pythonic )。并且我在这里包括了关于不可变数据类型的内容,但是我并不认为说“ int
是不可变的”就足够了,因为 explicit比隐式好。话虽如此,对不变类型和标准库copy
模块的了解可能是最完整的响应。