Форум программистов, компьютерный форум, киберфорум
Наши страницы
vlander
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Записки начинающего программиста Python. Баг или фича

Запись от vlander размещена 02.12.2018 в 19:27

Часто при описании базовой части знаний для программирования никто не акцентирует внимание на нюансы практической их работы и реализации, о чём и пойдёт пример ниже.
Недавно при написании простенькой программы для парсинга текста из файла в несколько списков столкнулся со странным поведением подпрограммы, выдавала чистый бред, хотя ошибиться в коде было сложно. Стал разбираться, и обнаружил что
запись вида
Python
1
2
lst1 = []
lst2 = []
совсем не тоже что и
Python
1
lst1 = lst2 = []
попробуйте выполнить простейший код
Python
1
2
3
4
5
6
s = 'spam'
lst1 = lst2 = []
lst1.append(s[0])
lst2.append(s[1])
print(lst1)
print(lst2)
и в результате на экране вы получите
['s', 'p']
['s', 'p']
как такое может быть?
Скорее всего lst2 создаётся как указатель на туже область памяти, что и lst1. В итоге изменение что одного, что другого равнозначны.
Размещено в Без категории
Просмотров 165 Комментарии 3
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Это не баг. Python работает с указателями на память.
    при lst1 = lst2 = [] ты указываешь две переменные на одно и тоже место в памяти, при
    lst1 = []
    lst2 = []
    каждому списку, свое место в памяти
    Запись от TAVulator размещена 03.12.2018 в 10:31 TAVulator вне форума
  2. Старый комментарий
    В Python все объект. Объекты передаются по ссылке. Таким образом каждой переменной x=x2=что-то присваивается разыменованная ссылка на один и тот же объект. Это нужно учитывать при работе с изменяемыми объектами.
    Python
    1
    2
    3
    4
    5
    6
    
    >>> x=x2=10
    >>> id(x)
    1562728864
    >>> id(x2)
    1562728864
    >>>
    Для неизменяемых объектов типа чисел и строк можно про это забыть, так как на ваш код это никак не повлияет и служит лишь целям внутренней оптимизации.
    Запись от Garry Galler размещена 03.12.2018 в 15:15 Garry Galler вне форума
  3. Старый комментарий
    Аватар для Avazart
    Это же вроде как азы.
    Правильнее говорить ссылки на объект.
    Так же стоит сразу почитать про глубокое копирование, что бы не возникало потом вопросов.
    Запись от Avazart размещена 04.12.2018 в 15:23 Avazart на форуме
    Обновил(-а) Avazart 04.12.2018 в 15:25
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru