在Python中创建类的默认对象列表?
我已经用Python定义了一个类在Python中创建类的默认对象列表?,python,Python,我已经用Python定义了一个类 class node(object): def __init__(self, children = []): self.children = children 我想创建类节点的默认对象列表或数组。例如,类似于C中的++ node * nodes = node[100]; 然后节点将指向类节点的100个默认对象的数组 在Python中如何实现类似的功能?谢谢。使用列表理解: nodes = [node() for _ in range(
class node(object):
def __init__(self, children = []):
self.children = children
我想创建类节点
的默认对象列表或数组。例如,类似于C中的++
node * nodes = node[100];
然后节点
将指向类节点
的100个默认对象的数组
在Python中如何实现类似的功能?谢谢。使用列表理解:
nodes = [node() for _ in range(100)]
您可以使用:
Python本身没有“数组”的概念,但它有一个更高层次结构的列表。列表可以像C数组一样编制索引,并且
正如我在评论中所说:
class node(object):
def __init__(self, children=None):
if children is None: children = []
self.children = children
如果使用了def\uuuu init\uuuuu(self,children=[]):
,则对列表所做的任何更改都将针对所有实例进行更改:
In [18]: class node(object):
....: def __init__(self, children = []):
....: self.children = children
....:
In [19]: n1= node()
In [20]: n2 = node()
In [21]: n1.children.append("foo") # add using n1
In [22]: n1.children
Out[22]: ['foo']
In [23]: n2.children # also effects n2's children list
Out[23]: ['foo']
正确的方法:
In [24]: class node(object):
....: def __init__(self, children=None):
....: if children is None: children = []
....: self.children = children
....:
In [25]: n1= node()
In [26]: n2 = node()
In [27]: n1.children.append("foo")
In [28]: n1.children
Out[28]: ['foo']
In [29]: n2.children
Out[29]: []
你可能想让
children=None,如果不是children:children=[]
@padraickenningham,他肯定应该这样做,但我认为你不应该使用如果不是children:
,以防以后你想将其初始化为空列表或其他测试为False
。更安全、更清晰,如果没有孩子,使用的时间也不会太长:
@padraickenningham:我不太明白为什么我的类定义不好,以及你建议我做什么。您也可以在您的帖子中修改我的类定义吗?这篇博客文章解释了为什么将空列表指定为默认参数可能是错误的。@Tim,我添加了一个快速示例为什么如果使用“def _uinit _;(self,children=[]):,您对列表所做的任何更改都将针对所有实例进行更改?map(节点,范围(100))
将构造节点(0)
,节点(1)
等,当您试图将这些节点的子节点
属性用作列表时,这将导致问题。@Tim:默认参数在创建函数时计算,而不是在调用函数时计算。另一种说法是,def
是一个可执行语句。@Tim,是的,列表创建一次,因此如果您有一个可变的默认参数,那么在创建函数时,您将创建一个对象。
In [18]: class node(object):
....: def __init__(self, children = []):
....: self.children = children
....:
In [19]: n1= node()
In [20]: n2 = node()
In [21]: n1.children.append("foo") # add using n1
In [22]: n1.children
Out[22]: ['foo']
In [23]: n2.children # also effects n2's children list
Out[23]: ['foo']
In [24]: class node(object):
....: def __init__(self, children=None):
....: if children is None: children = []
....: self.children = children
....:
In [25]: n1= node()
In [26]: n2 = node()
In [27]: n1.children.append("foo")
In [28]: n1.children
Out[28]: ['foo']
In [29]: n2.children
Out[29]: []