10

我正在尝试打印包含列表作为属性的 python 对象列表,但我得到了一些意想不到的结果:

这是我的代码:

class video(object):

    name = ''
    url = ''

class topic(object):

    topicName = ''
    listOfVideo = []

    def addVideo(self,videoToAdd):
        self.listOfVideo.append(videoToAdd)

    def getTopic(self):
        return self.topicName

    def getListOfVideo(self):
        return self.listOfVideo


topic1 = topic()
topic1.topicName = 'topic1'
video1 = video()
video1.name = 'VideoName1'
video1.url = 'VideoURL1'

video2 = video()
video2.name = 'VideoName2'
video2.url = 'VideoURL2'
topic1.addVideo(video1)
topic1.addVideo(video2)

topic2 = topic()
topic2.topicName = 'topic2'

video3 = video()
video3.name = 'VideoName3'
video3.url = 'VideoURL3'

video4 = video()
video4.name = 'VideoName4'
video4.url = 'VideoURL4'

topic2.addVideo(video3)
topic2.addVideo(video4)

topicsList = []
topicsList.append(topic1)
topicsList.append(topic2)

for topicCurrent in topicsList:
    print(topicCurrent.topicName)
    for video in topicCurrent.getListOfVideo():
        print(video.name)
        print(video.url)

期望得到的是:

主题1

视频名称1

视频URL1

视频名称2

视频URL2

主题2

视频名称3

视频URL3

视频名称4

视频URL4

但我实际上得到的是:

主题1

视频名称1

视频URL1

视频名称2

视频URL2

视频名称3

视频URL3

视频名称4

视频URL4

主题2

视频名称1

视频URL1

视频名称2

视频URL2

视频名称3

视频URL3

视频名称4

视频URL4

为什么?我想遍历我的主题列表并打印出每个主题中的每个视频,但是对于每个主题,它都会打印出所有视频???

这里发生了什么?

4

1 回答 1

11

您创建了class variables而不是instance variables,每个实例对象都不同。如下定义你的类:

class topic(object):

    def __init__(self):
        self.topicName = ''
        self.listOfVideo = []

    def addVideo(self,videoToAdd):
        self.listOfVideo.append(videoToAdd)

    def getTopic(self):
        return self.topicName

    def getListOfVideo(self):
        return self.listOfVideo

来自Python 教程

实例变量用于每个实例唯一的数据,类变量用于类的所有实例共享的属性和方法。

编辑:

要考虑的更重要的一件事是,为什么 onlylistOfVideo对于所有实例都是通用的,但不是topicName. 这是因为list' 是可变对象,而string' 是不可变的。

因此,对所有实例所做的任何更改listOfVideo都是通用的,即它们仍然引用命名空间listOfVideo中的定义topic

但是,当您这样做时,您会在命名空间中topic1.topicName = 'topic1'创建一个新变量,它会覆盖在(类)命名空间中找到的变量。您可以通过打印 value 来确认它,您会发现它是一个空字符串,即.topicNametopic1topicNametopictopic.topicName''

于 2016-07-19T04:42:11.513 回答