【问题标题】:how variable values get changed in recursion变量值如何在递归中改变
【发布时间】: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的信息

标签: python recursion


【解决方案1】:

maxnum 是你函数中的一个局部变量,因为你分配给它,所以它与全局 maxnum 无关。如果你使用不同的变量名会更清楚:

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]
max_initial_value = -99999
recurse(arr,max_initial_value ,0)

这会引发 NameError,因为这里不存在 maxnum

print('max result',maxnum)
# NameError: name 'maxnum' is not defined

这将打印原始的、未修改的值:

print('max result', max_initial_value)
max result -99999

在您的第二个示例中,您从未将任何内容分配给 myList,因此 Python 不认为它是本地的。您更新了唯一的全局 myList

【讨论】:

    猜你喜欢
    • 2022-06-28
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 2018-08-18
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多