Переменные и типы данных
Переменные не нужно объявлять заранее. У переменных нет типа. Тип есть только у данных, на которые указывают переменные. Для опредения типа используют функцию type()
x = 5
print(x) # 5
print(type(x)) # <class 'int'>
x = 3.14
print(x) # 3.14
print(type(x)) # <class 'float'>
x = 'Hello'
print(x) # Hello
print(type(x)) # <class 'str'>
int, float, str, bool, complex - встроенные типы данных языка. Они unmutable (неизменяемые). (Только неизменяемые данные могут быть ключами в словаре).
Ссылки на объекты
Все переменные содержат только ссылки на объекты.
Оператор = связывает переменную с объектом в памяти через ссылку. Если переменная уже существует, то справа от = напишем ссылку на объект, которая будет храниться в переменной. Если переменной еще нет, то оператор = создает переменную и записывает в нее ссылку (которая указана справа от =).
Для упрощения рисунков дальше вместо ссылок на неизменяемые объекты будем рисовать переменные со значением.
>>> a = 3
- Создается объект, представляющий число 3 (так как объект неизменяемый, то он создается только если его еще нет, но с логической точки зрения можете считать, что каждый раз создается новый объект).
- Создается переменная a, если ее еще нет.
- В переменную а записывается ссылка на объект, представляющий число 3.
Термины: Переменная - запись в системной таблице, где предусмотрено место для хранения ссылок на объекты. Объект - это область памяти с объемом, достаточным для представления значения этого объекта. Ссылка – это автоматически разыменовываемый указатель на объект.
Объект содержит описатель типа и счетчик ссылок. В описателе типа хранится информация о типе объекта. Счетчик ссылок нужен для автоматического удаления объектов.
Сборка мусора
В Python объекты удаляются автоматически сборщиком мусора, если на них нет ссылок. Сборка мусора (garbage collection) работает так же для каскадов объектов (на которые нет ссылок, или набор объектов с циклическими ссылками).
TODO: Иллюстрация понятия живых объектов и "мусора".
Принципы работы сборщика мусора:
- Убирается не сразу, когда объект стал мусором, а когда ему вздумается;
- Может не убираться, если есть хватает памяти;
- Можно "попросить убраться".
gc - модуль garbage collector.
Бывает ли memory leak в питоне?
Формально, вы не можете "потерять память". Но если вы держите ссылки на ненужные объекты, они остаются в памяти.
x = get_big_big_object() # x ссылается на большой объект
...
x = None # когда объект не нужен, можно перестать на него ссылаться
del x # или вообще удалить переменную
None - этого не может быть
>>> x = None
>>> x
>>> print(x)
None
>>> type(x)
<class 'NoneType'>
>>> x is None
True
>>> 12 is not None # проверка, что это не None (PEP-8)
True
>>> not 12 is None # тоже работает, но PEP-8 это не одобряет
True
>>> x == None
True
>>> x != None
False
Идентификаторы
Описаны в PEP 3131
- Первый символ должен быть либо _ либо алфавитным символом a-zA-Z либо алфавитным символом большинства алфавитов
- следующие символы могут так же содержать любой непробельный символ (например, цифры и символ Каталана)
- не быть ключевым словом (if, for, while и тп.)
- не пересекаться с предопределенными именами
- чтобы узнать какие имена предопределены, используйте функцию dir(__builtins__)
- начинаются с __ и заканчиваются им специальные методы: __init__, __lt__ и прочие
- _ и __ в начале идентификатора может влиять на область его видимости
Физические и логические строки. Точка с запятой
Физическая строка - то, что вы видите на экране, набирая код программы.
Логическая строка - то, что питон видит как единое предложение.
Неявно предполагается, что одной физической строке соотвествует одна логическая.
Последним символом строки можно поставить \ и написать одну логическую строку на двух физических.
Можно можно на одной физической строке написать несколько логических, разделяя их ;
i = i+5; print(i) # можно поставить ; в конце каждой строки, как вы привыкли в С++
Не ставьте лишние символы ; Они зашумляют чтение кода и показывают, что это "ваша первая программа на питоне".
Отступы
Отступы - это пробелы или табуляции в начале строки. Они важны.
Уровни вложенности в питоне обозначаются не скобками, а отступами.
Придерживайтесь одного стиля отступов - ЛИБО пробелы (рекомендовано 4), ЛИБО табуляции (одна). Не смешивайте их. В другом редакторе могут быть другие настройки табуляции и отступов (например, 1 табуляция = 8 пробелов) и тогда ваша логическая структура программы приобретет совсем другой вид.
Этот код не будет работать:
i = i+5
print(i) # Ошибка, лишний пробел в начале строки
print('Hello')
Поменять местами значение переменных x и y
x, y = y, x
Как это работает обсудим позже.
str
Строки можно писать в одинарных, двойных и тройных кавычках. Строки могут содежать любые символы юникода.
'Hello'
"Здесь могут быть русские буквы или другие символы юникода"
'''Текст на
несколько строк'''
Строки - неизменяемый тип данных. Нельзя изменить существующую строку, можно создать новую.
Подробнее строки и операции над ними будут рассмотрены позже.