前言
前段时间在用 Python 实现业务的时候发现一个坑,准确的来说是对于 Python 门外汉容易踩的坑;
大概代码如下:
class Mom(object):
name = ''
sons = []
if __name__ == '__main__':
m1 = Mom()
m1.name = 'm1'
m1.sons.append(['s1', 's2'])
print '{} sons={}'.format(m1.name, m1.sons)
m2 = Mom()
m2.name = 'm2'
m2.sons.append(['s3', 's4'])
print '{} sons={}'.format(m2.name, m2.sons)
首先定义了一个 Mom 的类,它包含了一个字符串类型的 name 与列表类型的 sons 属性;
在使用时首先创建了该类的一个实例 m1 并往 sons 中写入一个列表数据;紧接着又创建了一个实例 m2 ,也往 sons 中写入了另一个列表数据。
如果是一个 Javaer 很少写 Python 看到这样的代码首先想到的输出应该是:
m1 sons=[['s1', 's2']]
m2 sons=[['s3', 's4']]
但其实最终的输出结果是:
m1 sons=[['s1', 's2']]
m2 sons=[['s1', 's2'], ['s3', 's4']]
如果想要达到期望值需要稍微修改一下:
class Mom(object):
name = ''
def __init__(self):
self.sons = []
只需要修改类的定义就可以了,我相信即使没有 Python 相关经验对比这两个代码应该也能猜到原因:
在 Python 中如果需要将变量作为实例变量(也就是每个我们期望的输出