简单python oo issu

2024-04-25 22:42:32 发布

您现在位置:Python中文网/ 问答频道 /正文

看看这个简单的例子。我不太明白为什么o1打印两次“你好,亚历克斯”。我想是因为默认的self.a总是重置为空列表。有人能解释我的理由吗?非常感谢你。在

class A(object):
        def __init__(self, a=[]):
            self.a = a

o = A()
o.a.append('Hello')
o.a.append('Alex')
print ' '.join(o.a)

# >> prints Hello Alex

o1 = A()
o1.a.append('Hello')
o1.a.append('Alex')
print ' '.join(o1.a)

# >> prints Hello Alex Hello Alex

Tags: selfhello列表objectdefprintsclass例子
2条回答

Python中的默认参数,例如:

def blah(a="default value")

计算一次并在每次调用中重复使用,因此当您修改a时,将全局修改a。一个可能的解决方案是:

^{pr2}$

有关此问题的详细信息,请访问:http://www.ferg.org/projects/python_gotchas.html#contents_item_6

基本上,永远不要在参数的默认值上使用可变对象,如列表或字典。在

阅读以下关于可变默认函数参数的陷阱: http://www.ferg.org/projects/python_gotchas.html

简而言之,当你定义

def __init__(self,a=[])

由self.a引用的列表,默认情况下只在定义时定义一次,而不是在运行时定义。所以每次调用o.a.appendo1.a.append,都是在修改同一个列表。在

解决这个问题的典型方法是:

^{pr2}$

通过将self.a=[]移到__init__函数体中,将在运行时(每次调用__init__)创建一个新的空列表,而不是在定义时创建。在

相关问题 更多 >