对象列表python

2024-09-26 22:52:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图打印一个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)

我期望得到的是:

topic1

VideoName1

VideoURL1

VideoName2

VideoURL2

topic2

VideoName3

VideoURL3

VideoName4

VideoURL4

但实际上我得到的是:

topic1

VideoName1

VideoURL1

VideoName2

VideoURL2

VideoName3

VideoURL3

VideoName4

VideoURL4

topic2

VideoName1

VideoURL1

VideoName2

VideoURL2

VideoName3

VideoURL3

VideoName4

VideoURL4

为什么?我想迭代一下我的主题列表并打印出每个主题中的每个视频,但是对于每个主题,它会打印出所有的视频???在

这是怎么回事?在


Tags: nameselfurlvideotopic2topic1video1topicname
1条回答
网友
1楼 · 发布于 2024-09-26 22:52:05

您创建了class 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 Tutorial

Instance variables are for data unique to each instance and class variables are for attributes and methods shared by all instances of the class.

编辑:

需要考虑的另一个重要问题是,为什么只有listOfVideo对所有实例都是通用的,而不是{}。这是因为list是可变对象,而{}是不可变的。在

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

但是,当您执行topic1.topicName = 'topic1'操作时,您将在topic1名称空间中创建一个新变量topicName,该变量将覆盖topic(class)名称空间中的topicName。您可以通过打印值topic.topicName来确认它,您会发现它是一个空字符串,即''。在

相关问题 更多 >

    热门问题