Python类和实例属性混淆

标签 python

<分区>

Possible Duplicate:
“Least Astonishment” in Python: The Mutable Default Argument

为了上课

class ValidationResult():
    def __init__(self, passed=True, messages=[], stop=False):
        self.passed = passed
        self.messages = messages
        self.stop = stop

运行

foo = ValidationResult()
bar = ValidationResult() 
foo.messages.append("Foos message")  
print foo.messages
print bar.messages

产生

['Foos message']
['Foos message']

还有这个

foo = ValidationResult()
bar = ValidationResult(messages=["Bars message"]) 
foo.messages.append("Foos message")  
print foo.messages
print bar.messages

产生

['Foos message']
['Bars message']

我想我在这里错过了理解实例属性的机会。在第一个示例中,我希望 Foos 消息 仅应用于 foo。声明仅由其实例可变的对象属性的正确方法是什么?

使用 Python 2.7.1

最佳答案

你可以看到这里发生了什么:

>>> class ValidationResult():
...     def __init__(self, passed=True, messages=[], stop=False):
...         self.passed = passed
...         self.messages = messages
...         print id(self.messages)
...         self.stop = stop
... 
>>> foo = ValidationResult()
4564756528
>>> bar = ValidationResult()
4564756528

默认参数始终是内存中的同一个对象。列表的一个快速解决方法是为每个实例创建列表的副本:

>>> class ValidationResult():
...     def __init__(self, passed=True, messages=[], stop=False):
...         self.passed = passed
...         self.messages = messages[:]
...         print id(self.messages)
...         self.stop = stop
... 
>>> foo = ValidationResult()
4564756312
>>> bar = ValidationResult()
4564757032

关于Python类和实例属性混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10833320/

相关文章:

python - 在python中编辑文件

python - 如何标注图中每条线的最高点?

python - 重新引起困惑

python - 如何在非此即彼的情况下提供一组值?

python - numpy 数值微分

带有 NumPy 和对象引用的 Python 3

python - 使用 Python 在 MS Office 文档中嵌入对象?

python - 如何获取切换标志值以及标志切换之间的行总和

python - Pandas 将列添加到 groupby 数据框

python - 关于python分析的问题