按值而非引用复制变量



对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中的方法的任何值来执行,而不是我想要使用的另一个方法,因为我会递增它。

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

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

def搜索(问题,策略,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)

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

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

通常,如果您对引用和复制数据有顾虑,复制模块会为您提供所需的细粒度复制控制。

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

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

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

即:

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

这将打印"42"one_answers"43",表明修改b不会修改a。

若不复制泛型类型,则应该复制模块。任意类可以实现方法__copy____deepcopy__(更多信息(来复制对象,这是确保按照用户期望的方式进行复制的最Python的方法。

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

如果您想复制int或float或类似的东西,您可以尝试将值强制转换为字符串,然后返回到原始类型:

a = 20
b = int(f"{a}")
print(a, b)
a = 8181
print(a, b)
a = 1111
b = 123
print(a, b)

输出:

20   20
8181 20
1111 123

另一种支持附加值的方法,也可以说是最简单的方法,是编写一个只返回值的函数:

def copy_value(value_to_copy):
return value_to_copy

相关内容

  • 没有找到相关文章

最新更新