Python 为什么';返回自我';不返回?
我试图在Python 为什么';返回自我';不返回?,python,return-value,Python,Return Value,我试图在getTopParent()中获取链的顶部节点。当我打印出self.name时,它确实打印出父实例的名称;但是,当我返回self时,它不返回任何值。为什么会这样 class A: def __init__( self, name ): self.name = name self.owner = None def setChild( self, l ): l.owner = self def getTopParent(
getTopParent()
中获取链的顶部节点。当我打印出self.name
时,它确实打印出父实例的名称;但是,当我返回self
时,它不返回任何值。为什么会这样
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
您需要返回self.owner.gettoparent()
在Python中,您必须实际使用return
语句从函数返回某些内容,否则将返回None
。您需要返回self.owner.gettoparent()
在Python中,必须实际使用
return
语句从函数返回某些内容,否则将返回None
。在
else:
print( "checking %s" % self.name )
return self.owner.getTopParent()
由于None
是默认的返回值,那么它将输出:
checking child3
checking child2
checking child1
Got top: parent
<__main__.A instance at 0xb77a628c>
检查儿童3
检查儿童2
检查儿童1
第一名:家长
在中使用返回
else:
print( "checking %s" % self.name )
return self.owner.getTopParent()
由于None
是默认的返回值,那么它将输出:
checking child3
checking child2
checking child1
Got top: parent
<__main__.A instance at 0xb77a628c>
检查儿童3
检查儿童2
检查儿童1
第一名:家长
返回self
在if
的True
端工作正常。但是,else
端的递归调用不返回任何内容。使用return self.owner.gettoparent()
。返回self
在if
的True
端工作得很好。但是,else
端的递归调用不返回任何内容。改用返回self.owner.gettoparent()
。我对您的代码做了一些轻微的修改:
class A:
def __init__( self, name ):
self.name = name
self.owner = None
def setChild( self, l ):
l.owner = self
def getTopParent( self , depth=0):
if( self.owner == None ): # None == top parent
print( ' ' * depth + "Got top: %s" % self.name )
print( ' ' * depth + "Returning: %s" % self)
return self
else:
print( ' ' * depth + "checking %s" % self.name )
tmp = self.owner.getTopParent(depth=depth + 1)
print( ' ' * depth + "returned from call while checking %s" % self.name)
print( ' ' * depth + "returned value was: %s" % tmp)
a = A( "parent" )
b = A( "child1" )
c = A( "child2" )
d = A( "child3" )
a.setChild( b )
b.setChild( c )
c.setChild( d )
d_top_parent = d.getTopParent()
print('----------------')
print d_top_parent
现在,您可以看到调用d.gettoparent()
时发生了什么。以下是输出:
checking child3
checking child2
checking child1
Got top: parent
Returning: <__main__.A instance at 0x0000000002DE8DC8>
returned from call while checking child1
returned value was: <__main__.A instance at 0x0000000002DE8DC8>
returned from call while checking child2
returned value was: None
returned from call while checking child3
returned value was: None
----------------
None
现在,每个“checking childN”调用都从调用self.owner.gettopprent()
接收一个值,并将其返回给下一个最外层的调用方
如果你调用某个东西,并且你想让它的返回值去任何地方,你必须告诉它去哪里。可以使用赋值语句将其存储在某处,或者直接将其作为参数传递给另一个调用,或者直接返回。如果你只是有一个像这样的电话:
self.owner.getTopParent()
然后,返回的值将不存在,并且不能用于任何目的[3]
您正在调用的函数恰好与您所在的函数同名,这一事实与此无关;递归调用的工作方式与非递归调用的工作方式完全相同。我总是惊讶于递归对许多人来说是多么令人困惑,但这可能只是因为我不记得再学习它是什么样子了
[1] 如果您仔细想想,return
必须以这种方式工作。如果返回值一直跳到最外层的调用(如果在交互式解释器中运行,则显示为输出),那么如何编写调用其他函数的函数
[2] 此None
与从调用self.owner.gettoparent()
接收None
无关
[3] 除非您直接在交互式解释器中键入,否则Python将为您打印返回值,以便您可以看到它是什么。它还秘密地将它保存在变量\uuu
中,因此,如果您在看到它之后决定确实需要它,您可以了解它是什么。但在原则上,以及在任何其他上下文中,如果不使用调用的返回值执行任何操作,则会丢失该值。我对代码做了一些轻微的修改:
class A:
def __init__( self, name ):
self.name = name
self.owner = None
def setChild( self, l ):
l.owner = self
def getTopParent( self , depth=0):
if( self.owner == None ): # None == top parent
print( ' ' * depth + "Got top: %s" % self.name )
print( ' ' * depth + "Returning: %s" % self)
return self
else:
print( ' ' * depth + "checking %s" % self.name )
tmp = self.owner.getTopParent(depth=depth + 1)
print( ' ' * depth + "returned from call while checking %s" % self.name)
print( ' ' * depth + "returned value was: %s" % tmp)
a = A( "parent" )
b = A( "child1" )
c = A( "child2" )
d = A( "child3" )
a.setChild( b )
b.setChild( c )
c.setChild( d )
d_top_parent = d.getTopParent()
print('----------------')
print d_top_parent
现在,您可以看到调用d.gettoparent()
时发生了什么。以下是输出:
checking child3
checking child2
checking child1
Got top: parent
Returning: <__main__.A instance at 0x0000000002DE8DC8>
returned from call while checking child1
returned value was: <__main__.A instance at 0x0000000002DE8DC8>
returned from call while checking child2
returned value was: None
returned from call while checking child3
returned value was: None
----------------
None
现在,每个“checking childN”调用都从调用self.owner.gettopprent()
接收一个值,并将其返回给下一个最外层的调用方
如果你调用某个东西,并且你想让它的返回值去任何地方,你必须告诉它去哪里。可以使用赋值语句将其存储在某处,或者直接将其作为参数传递给另一个调用,或者直接返回。如果你只是有一个像这样的电话:
self.owner.getTopParent()
然后,返回的值将不存在,并且不能用于任何目的[3]
您正在调用的函数恰好与您所在的函数同名,这一事实与此无关;递归调用的工作方式与非递归调用的工作方式完全相同。我总是惊讶于递归对许多人来说是多么令人困惑,但这可能只是因为我不记得再学习它是什么样子了
[1] 如果您仔细想想,return
必须以这种方式工作。如果返回值一直跳到最外层的调用(如果在交互式解释器中运行,则显示为输出),那么如何编写调用其他函数的函数
[2] 此None
与从调用self.owner.gettoparent()
接收None
无关
[3] 除非您直接在交互式解释器中键入,否则Python将为您打印返回值,以便您可以看到它是什么。它还秘密地将它保存在变量\uuu
中,因此,如果您在看到它之后决定确实需要它,您可以了解它是什么。但是原则上,在任何其他上下文中,如果你不使用你调用的东西的返回值做任何事情,那么你就失去了这个值。因为你不能在其他
条款中返回任何东西,因为你不能在其他
条款中返回任何东西。明白了,这是有效的!不过,我对这种逻辑有点困惑:为什么它不能在else
之前返回一个值,而不是依赖程序首先从哪里运行?(例如,在else语句之后)。发生的是第一个函数调用生成一个s