【发布时间】:2020-05-17 10:02:28
【问题描述】:
我想知道整数变量如何在递归调用中改变它的值。我有一个递归函数在 python3 中找到数组的最大值,如下所示
def recurse(arr,maxnum,size):
#base case: when it reaches the end of an array
if size== len(arr):
return
maxnum= max(maxnum,arr[size])
print('current max in recursion',maxnum)
recurse(arr,maxnum,size+1)
arr = [5, 1, 6, 0, 3, 7, 4, 2]
maxnum = -99999
recurse(arr,maxnum,0)
print('max result',maxnum)
运行代码后,maxnum 仍然是-99999,没有任何变化,但我得到了以下打印结果
current max in recursion 5
current max in recursion 5
current max in recursion 6
current max in recursion 6
current max in recursion 6
current max in recursion 7
current max in recursion 7
current max in recursion 7
max result -99999
为什么 maxnum 在递归调用后会回到原来的变量。 但是,如果我如下创建一个 类似数组的变量,它可以工作
def recurse(arr,maxnum,size):
if size== len(arr):
return
maxList[0] = max(maxList[0],arr[size])
print('current max in recursion',maxList[0])
recurse(arr,maxList[0],size+1)
root = [5, 1, 6, 0, 3, 7, 4, 2]
maxnum=-9999
maxList = [-999]
recurse(root,maxList[0],0)
print('list',maxList[0])
current max in recursion 5
current max in recursion 5
current max in recursion 6
current max in recursion 6
current max in recursion 6
current max in recursion 7
current max in recursion 7
current max in recursion 7
list 7
【问题讨论】:
-
maxnum内部函数是局部变量 - 所以你不要直接更改全局变量maxnum中的值 - 在开始时两者都保持对相同值的引用,但是当你分配新值时,比如整数或字符串然后它分配给局部变量对新值的引用,但它不会更改全局变量。但是,如果您保留对列表或字典的引用,那么您会在同一个列表/字典中更改引用。也许在pythontutor.com 上运行它以查看参考 -
另见Modifying function arguments。不要太从字面上理解第一个答案,也要看看其他答案。
-
顺便说一句:查找有关Mutable vs Immutable Objects in Python的信息