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

在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(

我已经用Python定义了一个类

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]: []