我试图在getTopParent()
中获取链的顶部节点。当我输出self.name
时,它确实打印出父实例的名称;但是,当我返回self
时,它返回None。为什么会这样?在
class A:
def __init__( self, name ):
self.name = name
self.owner = None
def setChild( self, l ):
l.owner = self
def getTopParent( self ):
if( self.owner == None ): # None == top parent
print( "Got top: %s" % self.name )
return self
else:
print( "checking %s" % self.name )
self.owner.getTopParent()
a = A( "parent" )
b = A( "child1" )
c = A( "child2" )
d = A( "child3" )
a.setChild( b )
b.setChild( c )
c.setChild( d )
print( d.getTopParent() )
>>> checking child3
checking child2
checking child1
Got top: parent
None
在中使用
return
由于
^{pr2}$None
是默认返回值,因此它将输出:我对你的代码做了一些小小的修改:
现在您可以看到当您调用
^{pr2}$d.getTopParent()
时发生了什么。输出如下:在中间你可以看到它找到了顶级父级并返回了它。但是
return
返回到从[1]调用此函数的位置。因此只返回到“checking child1”调用。在回到“checking child1”调用中,它被称为
self.owner.getTopParent()
,它返回了顶级父级。在您的原始版本中,此后没有更多的代码,因此函数的执行“停止”。在我的版本中,它将从self.owner.getTopParent()
返回的值存储到一个变量tmp
中并打印它,这样我们就可以看到它是什么了。但它也会从函数的末尾脱落。在在Python中,命中函数的结尾相当于
return None
,因此返回给“checking child1”的调用者。因此,“checking child2”调用获取从self.owner.getTopParent()
返回的值None
。然后删除函数的末尾,将None
返回给它的调用者。[2]依此类推。在如果您将
return tmp
添加到我的版本中,在else
分支中打印之后,您将得到以下输出:现在,每个“checking childN”调用都从调用
self.owner.getTopParent()
接收一个值,并将其返回给下一个最外层的调用方。在如果你调用某个东西,并且你想让它的返回值去任何地方,你必须告诉它去哪里。可以使用赋值语句将其存储在某个地方,或者直接将其作为参数传递给另一个调用,或者直接返回它。如果你只有一个像这样的电话:
然后返回的值就不存在了,不能用于任何目的[3]。在
你正在调用的函数恰好与你所在的函数同名这一事实是不相干的;递归调用的工作原理与非递归调用的工作方式完全相同。我总是惊讶于递归对于很多人来说是多么令人困惑,但这可能只是因为我不记得再学习它是什么感觉了。:)
[1]如果你仔细想想,
return
有这样做。如果其他函数返回时返回值一直跳到最外层的调用(如果在交互式解释器中运行,则显示为输出),那么如何编写一个调用其他函数的函数?在[2]这个}无关。在
None
与从对self.owner.getTopParent()
的调用接收{[3]除非您直接在交互式解释器中键入该值,否则Python会为您打印返回值,这样您就可以看到它是什么了。它还秘密地将它保存在变量
_
中,因此如果您在看到它之后决定确实需要它,那么您可以得到它的原样。但原则上,在任何其他上下文中,如果你对你调用的东西的返回值不做任何操作,那么你就失去了这个值。在你需要返回
self.owner.getTopParent()
!在在Python中,必须实际使用
return
语句从函数中返回某些内容,否则返回None
。在相关问题 更多 >
编程相关推荐