#!/usr/bin/env python
# -*- Coding=UTF-8 -*-
class parser:
def __init__(self, x=[]):
print "early-init: id(x) = %s" % id(x)
self.numbers = x
print "post-init: id(self.numbers) = %s, id(x) = %s" % (id(self.numbers), id(x))
def load(self):
for i in range(0, 10):
self.numbers.append(i)
p = parser()
p.load()
print "len(p.numbers): %s " % len(p.numbers)
p1 = parser()
print "len(p1.numbers): %s " % len(p1.numbers)
上述代码的运行结果为:
early-init: id(x) = 4531521656
post-init: id(self.numbers) = 4531521656, id(x) = 4531521656
len(p.numbers): 10
early-init: id(x) = 4531521656
post-init: id(self.numbers) = 4531521656, id(x) = 4531521656
len(p1.numbers): 10
原因很明显,__init__的默认输入参数x的地址是不变的。
如果初始化实例p时,没有指定参数,那么将拷贝x的值到p.numbers,修改了p.numbers的内容,也就是修改了x的内容。
初始化p1时,参数没有指定,使用默认值x,x的内容已经被p.numbers修改,不再是[]。
安全的做法是self.numbers = x[:]。