对于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: '))
一般来说,如果您关心引用和复制数据,copy module将为您提供所需的细粒度复制控制。在
copy.copy
保证执行“浅层复制”,其中列表将包含对旧数据的引用,但将是一个新列表(或其他容器)。在copy.deepcopy
将为您提供一个“深度复制”,其中元素本身将被复制。在但是在本例中,您有一个简单的类型
int
,并且是不可变的,因此每当值发生更改时,都会创建一个新实例。(这比不可变对象的情况要复杂一些,但关键是如果使用的是简单类型,赋值运算符=
将不会修改已分配的那些symple类型的其他实例。)即:
这将打印“42”和“43”,表明修改b不会修改a
如果不复制泛型类型,则应复制模块。任意类可以实现方法
__copy__
和__deepcopy__
(more info)来复制对象,这是确保以用户期望的方式生成副本的最python方法。在编辑: 那些会编辑帖子以删除我回应的第一人称声音的人,不要这样做。我回答了作业,而不是写技术期刊,可读性很重要。我承认我的回答是不正确的,但只是因为我建议在不必要的时候使用
int
类型构造函数(尽管结果是一样的,但它不是pythonic)。我在这里介绍了不可变数据类型,但我不认为说“int
是不可变的”是一个足够的答案,因为显式比隐式好。尽管如此,了解不可变类型和标准库copy
模块可能是最完整的响应。在相关问题 更多 >
编程相关推荐