gpt4 book ai didi

Python - range() 在递归时会改变变量值吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:10:36 25 4
gpt4 key购买 nike

在理解字符串排列及其在 python 中的实现时(关于 this post ),我偶然发现了使用 range()for 循环中的一些东西,我只是不知道听不懂。

采用以下代码:

def recursion(step=0):
print "Step I: {}".format(step)
for i in range(step, 2):
print "Step II: {}".format(step)
print "Value i: {}".format(i)

print "Call recursion"
print "\n-----------------\n"

recursion(step + 1)

recursion()

这给出了以下输出:

root@host:~# python range_test.py

Step I: 0
Step II: 0
Value i: 0
Call recursion

-----------------

Step I: 1
Step II: 1
Value i: 1
Call recursion

-----------------

Step I: 2
Step II: 0 <---- WHAT THE HECK?
Value i: 1
Call recursion

-----------------

Step I: 1
Step II: 1
Value i: 1
Call recursion

-----------------

Step I: 2
root@host:~#

正如您所看到的,变量 step 在使用 range() 运行某个 for 循环后获得一个新值 - 请参阅 到底是什么标记。

有什么办法可以消除迷雾吗?

最佳答案

您的结论不正确step使用 range 不会改变值。这可以验证为:

def no_recursion(step=0):
print "Step I: {}".format(step)
for i in range(step, 2):
print "Step II: {}".format(step)
print "Value i: {}".format(i)

no_recursion(step=2)

产生输出:

 Step I: 2

预计自 range(2,2)返回[] .

错觉 step由于函数 recursion 将其值更改为 0 (用 step=2 调用)在打印 Step I: 2 后返回,然后控制权返回到函数 recursion (用 step=1 调用)从 for loop 开始立即返回已终止,然后控制权返回到 recursion (用 step=0 调用)由于还剩下 1 次迭代,所以会继续,并打印 Step II: 0安慰这并不奇怪。如果我们稍微修改代码(通过添加函数入口和导出日志记录)并观察输出,这可以更容易观察:

def recursion(step=0):
print "recursion called with [step = {}]".format(step) # add entry logging
print "Step I: {}".format(step)
for i in range(step, 2):
print "Step II: {}".format(step)
print "Value i: {}".format(i)

print "Call recursion"
print "\n-----------------\n"

recursion(step + 1)
print "--> returned recursion [step = {}]".format(step) # add exit logging

recursion()

此代码产生的输出是:

recursion called with [step = 0]
Step I: 0
Step II: 0
Value i: 0
Call recursion

-----------------

recursion called with [step = 1]
Step I: 1
Step II: 1
Value i: 1
Call recursion

-----------------

recursion called with [step = 2]
Step I: 2
--> returned recursion [step = 2]
--> returned recursion [step = 1]
Step II: 0
Value i: 1
Call recursion

-----------------

recursion called with [step = 1]
Step I: 1
Step II: 1
Value i: 1
Call recursion

-----------------

recursion called with [step = 2]
Step I: 2
--> returned recursion [step = 2]
--> returned recursion [step = 1]
--> returned recursion [step = 0]

我们可以清楚地看到递归展开的顺序并观察 step 的值每个步骤都是一致的。

关于Python - range() 在递归时会改变变量值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39362283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com