список объектов 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

почему? Я хочу повторить свой список тем и распечатать каждое видео в каждой теме, но для каждой темы он распечатывает все видео???

что здесь происходит?

1 ответов


создана 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 Учебник:

переменные экземпляра предназначены для данных, уникальных для каждого экземпляра и класса переменные атрибуты и методы, общие для всех экземпляров класс.

EDIT:

еще одна важная вещь, чтобы рассмотреть вот почему только listOfVideo было общим для всех случаев, но не topicName. Это потому что listизменяемые объекты в то время как stringнеизменны.

поэтому любые изменения, внесенные в listOfVideo являются общими для всех экземпляров, т. е. они по-прежнему относятся к listOfVideo определена в topic пространство имен.

однако, когда вы делаете topic1.topicName = 'topic1', вы создаете новую переменную topicName внутри topic1 пространство имен, которое переопределяет topicName нашли в topic(имя класса). Вы можете подтвердить его печать значения topic.topicName, который вы найдете пустой строкой, т. е. ''.