2017-09-16 68 views
0

enter image description here作为传递值的声明空列表代表什么?

从我的理解,传递给初始化的inbound_nodes = []只是声明了一个空列表。因此,即使我创建了Node的子类,并且在该子类中调用了此函数,但没有传递任何参数,__init__函数仍然可以工作,因为它自己声明了一个空列表。

我对不对?

接下来的问题是,我们可以看到self.inbound_nodes = inbound_nodes。

这是不是说,self.inbound_nodes也是一个空列表,但在Node超类内?如果是这样,为什么我不能以同样的方式声明self.outbound_nodes?

最后一个问题是,最后一个循环做了什么?

+0

Python没有变量声明,您正在*使用列表文字语法初始化一个空列表,然后*将该列表设置为默认参数*。你不是*传递任何东西*,那是*函数定义*。请注意,这是常见错误的来源,如果您不了解python默认参数的工作方式,请参阅[这个着名的问题](https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable -default-argument) –

+1

此外,'self.inbound_nodes = inbound_nodes'创建一个实例变量'self.inbound_nodes'并将它指定给与inbound_nodes相同的对象*。你应该只是阅读Python中的OOP教程。另外,请不要*发布代码图片!*。代码是文本。请将您的代码作为格式化文本*发布在问题本身*中。 –

+0

inbound_nodes = []参数是一个默认值,这意味着如果调用者使用列表调用函数就可以,如果不是,它将通过一个空列表 –

回答

2

不完全。当参数在函数定义处被初始化时,它们只被执行一次。它将创建一个空列表并将其用作默认参数。这意味着,这是initalized使用默认参数的所有对象使用同一列表

class Node(object): 
    def __init__(self, inbound=[]): 
     self.inbound = inbound 

class SubNode(Node): 
    pass 

node = Node() 
subnode = SubNode() 

print node.inbound is subnode.inbound # returns True 
print id(node.inbound) # 66058248 
print id(subnode.inbound) # 66058248 

这是相同的列表对象。 这是因为函数参数只评估一次。如果你想每个对象都有自己的空单,你应该定义在init如下

def __init__(self, inbound=None): 
     self.inbound = inbound or [] 

关于循环,我不知道它是什么想的事情。

+0

因此,例如,让我们说,我已经创建了一个新的sublcass称为A: 'A类(节点)' 所以在我的子类A,我写了这个代码: 'A类(节点): DEF __init __(self): 节点。___ init ___(self)' 这是否意味着,因为我没有传递任何值,默认情况下,类A会得到self.inbound = []? –

+0

如果您不覆盖它,您不需要调用'Node .__ init __(self)',因为它默认情况下会发生。是的,它会有相同的列表对象。想想那样,该函数被评估一次,并创建一个默认的列表对象。当调用该函数(创建对象)时,除非提供了另一个对象,否则该列表对象将被分配。 – Vinny

+0

@AbylIkhsanov如果你发现我的答案有帮助,请考虑提高它。谢谢 – Vinny

相关问题