chr*_*ant 11 python constructor optional-parameters
可能重复:
python中最不惊讶:可变的默认参数
我想了解python __init__构造函数的行为和含义.看起来当有一个可选参数并且您尝试将现有对象设置为新对象时,将保留并复制现有对象的可选值.
看一个例子:
在下面的代码中,我试图创建一个带有节点和可能有很多子节点的树结构.在第一个类中NodeBad,构造函数有两个参数,值和任何可能的子节点.第二类NodeGood仅将节点的值作为参数.两者都有一个addchild将子节点添加到节点的方法.
使用NodeGood类创建树时,它按预期工作.但是,当与NodeBad班级做同样的事情时,似乎只能添加一次孩子!
下面的代码将产生以下输出:
Good Tree
1
2
3
[< 3 >]
Bad Tree
1
2
2
[< 2 >, < 3 >]
Run Code Online (Sandbox Code Playgroud)
Que Pasa?
这是一个例子:
#!/usr/bin/python
class NodeBad:
def __init__(self, value, c=[]):
self.value = value
self.children = c
def addchild(self, node):
self.children.append(node)
def __str__(self):
return '< %s >' % self.value
def __repr__(self):
return '< %s >' % self.value
class NodeGood:
def __init__(self, value):
self.value = value
self.children = []
def addchild(self, node):
self.children.append(node)
def __str__(self):
return '< %s >' % self.value
def __repr__(self):
return '< %s >' % self.value
if __name__ == '__main__':
print 'Good Tree'
ng = NodeGood(1) # Root Node
rootgood = ng
ng.addchild(NodeGood(2)) # 1nd Child
ng = ng.children[0]
ng.addchild(NodeGood(3)) # 2nd Child
print rootgood.value
print rootgood.children[0].value
print rootgood.children[0].children[0].value
print rootgood.children[0].children
print 'Bad Tree'
nb = NodeBad(1) # Root Node
rootbad = nb
nb.addchild(NodeBad(2)) # 1st Child
nb = nb.children[0]
nb.addchild(NodeBad(3)) # 2nd Child
print rootbad.value
print rootbad.children[0].value
print rootbad.children[0].children[0].value
print rootbad.children[0].children
Run Code Online (Sandbox Code Playgroud)
Jus*_*ier 13
问题是,可选参数的默认值只是一个实例.因此,例如,如果您说def __init__(self, value, c=[]):,[]每次通过调用代码使用可选参数时,相同的列表将被传递到方法中.
所以基本上你应该只使用不可变日期类型,例如None可选参数的默认值.例如:
def __init__(self, value, c=None):
Run Code Online (Sandbox Code Playgroud)
然后你可以在方法体中创建一个新列表:
if c == None:
c = []
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11938 次 |
| 最近记录: |