class Foo(object):
def __init__(self,x):
self.x = x
self.is_bar = False
def __repr__(self): return str(self.x)
class Bar(object):
def __init__(self,l = []):
self.l = l
def add(self,o):
self.l += [o]
def __repr__(self): return str(self.l)
def foo_plus_foo(f1,f2):
t = Bar()
if not (f1.is_bar and f2.is_bar):
f1.is_bar = True
f2.is_bar = True
t.add(f1)
t.add(f2)
print 'HERE'
return t
if __name__ == '__main__':
li = [Foo(1), Foo(2)]
print foo_plus_foo(li[0],li[1])
print foo_plus_foo(li[0],li[1])
Run Code Online (Sandbox Code Playgroud)
意想不到的输出:
HERE
[1, 2]
[1, 2]
Run Code Online (Sandbox Code Playgroud)
预期产量:
HERE
[1, 2]
[]
Run Code Online (Sandbox Code Playgroud)
怎么了?我做错了什么?为什么python使用旧值?我该怎么做才能避免这种情况?
谢谢!
决不.做.这个.
def __init__(self,l = []):
Run Code Online (Sandbox Code Playgroud)
决不.
一个list对象被重用.并且它是可变的,因此每次重用时,[]都会更新在方法定义中创建的唯一的.
总是.做.这个.
def __init__( self, l= None ):
if l is None: l = []
Run Code Online (Sandbox Code Playgroud)
这创建了一个全新的,独特的列表实例.