Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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_Return Value - Fatal编程技术网

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