Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归期间变量更改的状态_Python_Python 3.x_Recursion - Fatal编程技术网

Python 递归期间变量更改的状态

Python 递归期间变量更改的状态,python,python-3.x,recursion,Python,Python 3.x,Recursion,我试图理解当我们返回一个值时与在递归过程中调用函数时的区别返回这个概念对我来说很有意义,因此我只在调用函数和输出时显示代码 d={2:'ab'} def print_str(digit,curr_idx,output): if curr_idx==len(d[digit]): #print(output) return for j in range(curr_idx,len(d[digit])): output.append(d[digit][j]) p

我试图理解当我们
返回一个值时与在递归过程中调用函数时的区别<代码>返回
这个概念对我来说很有意义,因此我只在调用函数和输出时显示代码

d={2:'ab'}

def print_str(digit,curr_idx,output):
  if curr_idx==len(d[digit]):
    #print(output)
    return
  for j in range(curr_idx,len(d[digit])):
    output.append(d[digit][j])
    print_str(digit,curr_idx+1,output)
    print(j,output)


print_str(2,0,[])
    
这里的目标是单独打印所有字符,因此
[a,b]

if curr_idx=2:
   print (output) /*output has been suppressed for brevity*/
   return
但是我的问题是关于
for
循环中的最后一个语句<代码>打印(j,输出)。它给出了如下输出:

1 ['a', 'b']
0 ['a', 'b']
1 ['a', 'b', 'b', 'b']
1 ['a', 'b', 'b', 'b']

我不能理解这个输出的第二行;当在上一次函数调用中
j=0
时,输出shd为
['a']
,这是调用函数时
输出的值。但是为什么我们看到的输出是
0,['a','b']
。能帮我理解一下吗?提前感谢。

您先呼叫
print\u str(数字、电流、idx+1、输出)

调用该函数时,值为['a'],但该函数调用的结果将
。追加到传入的列表中。递归调用返回,然后打印列表的内容,该内容在递归调用中已更改

停止考虑可变的变化。变量没有改变。当您执行类似于
my\u var=something
的操作时,变量会发生变化。相反,您改变了变量所引用的对象。这并不比:

def bar(data):
    data.append('bar')

def foo(input):
    input.append('foo')
    bar(input)
    print(input)

foo([])

这将打印
['foo',bar']
而不是
['foo']
,即使当您调用
bar
时,
input
引用的列表的值为
['bar']

,您说您理解返回,但情况似乎并非如此。函数总是返回一个值,但如果您不告诉它具体返回什么,它将返回
None

返回值在递归中起着非常重要的作用,例如:

def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n-1)
在此之后,您希望
a
看起来像
[1,2]
,它确实是这样。在函数中执行时,无论是递归还是其他方式,都没有什么不同:

def add_number(xs, n):
    if n > 1:
        add_number(xs, n-1)
    xs.append(n)


my_list = []
add_number(my_list, 3)

运行它,
my_list
将成为
[1,2,3]
,即使它似乎只会用空列表的“值”调用。函数不会使用列表的值或列表的副本来调用,而是通过函数的各种迭代来传递和操纵对现有列表的引用。

同意您的推理。实际上,return用于停止执行,这不是它的理想用途。
def add_number(xs, n):
    if n > 1:
        add_number(xs, n-1)
    xs.append(n)


my_list = []
add_number(my_list, 3)