作为一种面向对象的编程语言,“类”在python中的应用非常普遍。有时候,我们需要将list作为某个类的属性。进一步的,在有些场景下,我们希望能够对某个list属性进行初始化。如果需要进行这步操作,那一定要注意了。
譬如,如果有一个类的Article,其定义为:
class Article:
def __init__(self,subject='',paragraph_list=[]):
self.subject = subject
self.paragraph_list = paragraph_list
当需要使用初始化类时:
articleinfo1 = Article()
articleinfo2 = Article()
若有操作:
articleinfo1.paragraph_list.append('paragraph1.1')
articleinfo1.paragraph_list.append('paragraph1.2')
articleinfo2.paragraph_list.append('paragraph2.1')
articleinfo2.paragraph_list.append('paragraph2.2')
打印:
for paragraph in articleinfo2.paragraph_list:
print(paragraph)
会发现显示:
paragraph1.1
paragraph1.2
paragraph2.1
paragraph2.2
这肯定不是我们想要的结果。
打印两个paragraph_list的id:
print(id(articleinfo1.paragraph_list))
print(id(articleinfo2.paragraph_list))
发现相同。原因应该是这两个Article实例引用相同的paragraph_list地址,因此,解决办法有两个:
一是在初始化时,指定paragraph_list的初始化值:
articleinfo1 = Article('subject1',[])
articleinfo2 = Article('subject2',[])
二是将Article的定义修改为:
class Article:
def __init__(self,subject=''):
self.subject = subject
self.paragraph_list = []