Здесь разберем как Python работает с переменными и определим, какие типы данных можно использовать в рамках этого языка. Подробно рассмотрим модель данных Python, а также механизмы создания и изменения значения переменных.
Если достаточно формально подходить к вопросу о типизации языка Python, то можно сказать, что он относится к языкам с неявной сильной динамической типизацией.
Неявная типизация означает, что при объявлении переменной вам не нужно указывать её тип, при явной – это делать необходимо. В качестве примера языков с явной типизацией можно привести Java, C++ . Вот как будет выглядеть объявление целочисленной переменной в Java и Python.
int a = 1 ;
a = 1
В Python типы данных можно разделить на встроенные в интерпретатор (built-in
) и
не встроенные, которые можно использовать при импортировании соответствующих
модулей.
К основным встроенным типам относятся:
None
(неопределенное значение переменной)Boolean Type
)Numeric Type
)
int
– целое числоfloat
– число с плавающей точкойcomplex
– комплексное числоSequence Type
)
list
– списокtuple
– кортежrange
– диапазонText Sequence Type
)
str
bytes
– байтыbytearray
– массивы байтmemoryview
– специальные объекты для доступа к внутренним данным объекта через protocol buffer
Set Types
)
set
– множествоfrozenset
– неизменяемое множествоMapping Types
)
dict
– словарь
Рассмотрим как создаются объекты в памяти, их устройство, процесс объявления новых переменных и работу операции присваивания.
Для того, чтобы объявить и сразу инициализировать переменную необходимо написать её имя, потом поставить знак равенства и значение, с которым эта переменная будет создана.
Например строка:
b = 5
Объявляет переменную b
и присваивает ей значение 5
.
Целочисленное значение 5
в рамках языка Python по сути своей является
объектом. Объект, в данном случае – это абстракция для представления данных,
данные – это числа, списки, строки и т.п. При этом, под данными следует понимать как
непосредственно сами объекты, так и отношения между ними (об этом чуть позже).
Каждый объект имеет три атрибута – это идентификатор, значение и тип.
Идентификатор – это уникальный признак объекта, позволяющий отличать объекты друг от друга, а значение – непосредственно информация, хранящаяся в памяти, которой управляет интерпретатор.
При инициализации переменной, на уровне интерпретатора, происходит следующее:
5
(можно представить, что в этот момент создается ячейка и число 5
«кладется» в эту ячейку);5
, и тип: целое число;=
создается ссылка между переменной b
и целочисленным объектом 5
(переменная b
ссылается на объект 5
).Допустимые имена переменных в языке Python – это последовательность символов произвольной длины, содержащей «начальный символ» и ноль или более «символов продолжения». Имя переменной должно следовать определенным правилам и соглашениям.
Первое правило касается начального символа и символов
продолжения. Начальным символом может быть любой символ, который в
кодировке Юникод рассматривается как принадлежащий диапазону
алфавитных символов ASCII (a
, b
, ..., z
, A
, B
, ..., Z
),
символ подчеркивания (_
), а также символы большинства национальных
(не английских) алфавитов. Каждый символ продолжения может быть
любым символом из тех, что пригодны в качестве начального символа,
а также любым непробельным символом, включая символы, которые
в кодировке Юникод считаются цифрами, такие как (0
, 1
, ...,
9
), и символ Каталана ·
. Идентификаторы чувствительны к регистру,
поэтому TAXRATE
, Taxrate
, TaxRate
, taxRate
и taxrate
– это
пять разных переменных.
Имя переменной не должно совпадать с ключевыми словами интерпретатора
Python. Список ключевых слов можно получить непосредственно в программе, для
этого нужно подключить модуль keyword
и воспользоваться командой
keyword.kwlist
.
import keyword
print("Python keywords: " , keyword.kwlist)
Проверить является или нет идентификатор ключевым словом можно так:
>>> keyword.iskeyword("try")
True
>>> keyword.iskeyword( "b" )
False
Не должны использоваться имена, начинающиеся и заканчивающиеся двумя
символами подчеркивания (такие как __lt__
). В языке
Python определено множество различных специальных методов и переменных
с такими именами (и в случае специальных методов мы можем заменять их,
то есть создать свои версии этих методов), но мы не должны вводить
новые имена такого рода.
Символ подчеркивания сам по себе может использоваться в качестве
идентификатора; внутри интерактивной оболочки интерпретатора или
в командной оболочке Python в переменной с именем _
сохраняется
результат последнего вычисленного выражения. Во время выполнения
обычной программы идентификатор _
отсутствует, если мы явно не
определяем его в своем программном коде. Некоторые программисты
любят использовать _
в качестве идентификатора переменной цикла
в циклах for
... in
, когда не требуется обращаться к элементам, по
которым выполняются итерации. Например:
for _ in (0, 1, 2, 3, 4, 5):
print("Hello")
Для того, чтобы посмотреть на объект с каким идентификатором ссылается данная
переменная, можно использовать функцию id()
.
>>> a = 4
>>> b = 5
>>> id (a)
1829984576
>>> id (b)
1829984592
>>> a = b
>>> id (a)
1829984592
Как видно из примера, идентификатор – это некоторое целочисленное значение,
посредством которого уникально адресуется объект. Изначально переменная a
ссылается на объект 4
с идентификатором 1829984576
, переменная b
– на объект с id = 1829984592
. После выполнения операции
присваивания a = b
, переменная a стала ссылаться на тот же объект,
что и b
.
Тип переменной можно определить с помощью функции type()
. Пример
использования приведен ниже.
>>> a = 10
>>> b = "hello"
>>> c = ( 1 , 2 )
>>> type (a)
< class 'int' >
>>> type (b)
< class 'str' >
>>> type (c)
< class 'tuple' >
В Python существуют изменяемые и неизменяемые типы.
К неизменяемым (immutable
) типам относятся:
int
);float
);complex
);bool
);tuple
);str
);frozen set
).list
);set
);dict
).
Неизменяемость типа данных означает, что созданный объект больше не
изменяется. Например, если мы объявим переменную k = 15
, то будет создан объект
со значением 15
, типа int
и идентификатором, который можно узнать с помощью
функции id()
.
>>> k = 15
>>> id (k)
1672501744
>>> type (k)
< class 'int' >
Объект с id = 1672501744
будет иметь значение 15
и изменить его уже нельзя.
Если тип данных изменяемый, то можно менять значение объекта.
Например, создадим список [1, 2]
, а потом заменим второй элемент на
3
.
>>> a = [1, 2]
>>> id (a)
47997336
>>> a[1] = 3
>>> a
[ 1 , 3 ]
>>> id(a)
47997336
Как видно, объект на который ссылается переменная a
, был изменен. Это можно
проиллюстрировать следующим рисунком.
В рассмотренном случае, в качестве данных списка, выступают не объекты, а
отношения между объектами. Т.е. в переменной a хранятся ссылки на объекты
содержащие числа 1
и 3
, а не непосредственно сами эти числа.