@Aquinary
Хинафаг.

Что может быть не так при работе со списком в Python?

Имеется такой класс:
class Poster:<...>
class Poster:

    def __init__(self):
        self.posts = []
        self.content = {}

    def set_posts(self, **params):
        """Установка полей для контента
        
        Аргументы метода:
        self -- cлужебное
        key -- поля, значение которых необходимо установить
        
        """
        for iterator in range(10):
            self.posts.append(params['key'])

Делаем так:
Исполняемый код
if __name__ == '__main__':
    post = Poster()
    post.set_posts(key={'type': None, 'content': None})

    for i in range(len(post.posts)):
        print (post.posts[i])

Результат
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}


Пока всё хорошо.
Меняем слегка исполняемый код:
Исполняемый код
if __name__ == '__main__':
    post = Poster()
    post.set_posts(key={'type': None, 'content': None})

    post.posts[0]['type'] = 'test'
    
    for i in range(len(post.posts)):
        print (post.posts[i])


Казалось бы, чего здесь странного, мы перезаписываем значение в списке по [0]['type'] на "test".
Но...
Результат
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}
{'type': 'test', 'content': None}


Почему?
Примечательно, что если в классе поменять в методе set_posts(...) на такое:
for iterator in range(10):
        self.posts.append({'type': None, 'content': None})
, то всё отлично работает:
Результат
{'type': 'test', 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}
{'type': None, 'content': None}


Не могу понять. Вот смотрю и не могу понять. Может в глаза долблюсь, не знаю, но вот не догоняю что-то.
Благодарю за помощь заранее :)
  • Вопрос задан
  • 235 просмотров
Решения вопроса 1
amux
@amux
alp.ac
for iterator in range(10):
  self.posts.append(params['key']) # Получается ссылка на один и тот-же объект


for iterator in range(10):
  self.posts.append(params['key'].copy()) # Для каждого необходимо копировать новый объект
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Stqs
senior software developer
загуглите про изменяемые и неизменяемые объекты (mutable vs immutable)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы