看看这个简单的例子。我不太明白为什么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
Python中的默认参数,例如:
计算一次并在每次调用中重复使用,因此当您修改a时,将全局修改a。一个可能的解决方案是:
^{pr2}$有关此问题的详细信息,请访问:http://www.ferg.org/projects/python_gotchas.html#contents_item_6
基本上,永远不要在参数的默认值上使用可变对象,如列表或字典。在
阅读以下关于可变默认函数参数的陷阱: http://www.ferg.org/projects/python_gotchas.html
简而言之,当你定义
由self.a引用的列表,默认情况下只在定义时定义一次,而不是在运行时定义。所以每次调用
o.a.append
或o1.a.append
,都是在修改同一个列表。在解决这个问题的典型方法是:
^{pr2}$通过将
self.a=[]
移到__init__
函数体中,将在运行时(每次调用__init__
)创建一个新的空列表,而不是在定义时创建。在相关问题 更多 >
编程相关推荐