HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>В этой статье мы поговорим, как определить тип переменной в Python. Заодно, расскажем, почему одни переменные считают изменяемыми, а другие нет. И какие тут существуют тонкости, связанные с терминологией.</p>
1 <p>В этой статье мы поговорим, как определить тип переменной в Python. Заодно, расскажем, почему одни переменные считают изменяемыми, а другие нет. И какие тут существуют тонкости, связанные с терминологией.</p>
2 <p>В некоторых случаях нужно определить тип данных переменной в Python. Проверить, к какому типу принадлежит та или иная переменная, можно посредством функции<strong>type</strong>:</p>
2 <p>В некоторых случаях нужно определить тип данных переменной в Python. Проверить, к какому типу принадлежит та или иная переменная, можно посредством функции<strong>type</strong>:</p>
3 &gt;&gt;&gt; a = 10 &gt;&gt;&gt; b = [1,2,3] &gt;&gt;&gt; type(a) == int True &gt;&gt;&gt; type(b) == list True &gt;&gt;&gt; type(a) == float False<p>Также мы можем определить тип данных переменной в Python посредством функции isinstance():</p>
3 &gt;&gt;&gt; a = 10 &gt;&gt;&gt; b = [1,2,3] &gt;&gt;&gt; type(a) == int True &gt;&gt;&gt; type(b) == list True &gt;&gt;&gt; type(a) == float False<p>Также мы можем определить тип данных переменной в Python посредством функции isinstance():</p>
4 &gt;&gt;&gt; isinstance(a,int) True &gt;&gt;&gt; isinstance(b,list) True &gt;&gt;&gt; isinstance(b,tuple) False &gt;&gt;&gt; c = (4,5,6) &gt;&gt;&gt; isinstance(c,tuple) True<p>Здесь стоит обратить внимание, что isinstance() в отличие от type даёт возможность проверять тип данных на принадлежность хотя бы одному типу из кортежа, который передан в качестве 2-го аргумента:</p>
4 &gt;&gt;&gt; isinstance(a,int) True &gt;&gt;&gt; isinstance(b,list) True &gt;&gt;&gt; isinstance(b,tuple) False &gt;&gt;&gt; c = (4,5,6) &gt;&gt;&gt; isinstance(c,tuple) True<p>Здесь стоит обратить внимание, что isinstance() в отличие от type даёт возможность проверять тип данных на принадлежность хотя бы одному типу из кортежа, который передан в качестве 2-го аргумента:</p>
5 &gt;&gt;&gt; isinstance(a,(float, int, str)) True &gt;&gt;&gt; isinstance(a,(list, tuple, dict)) False<p>Также следует упомянуть и другое, не менее значимое достоинство isinstance() - поддержка наследования. Для isinstance() экземпляр производного класса является экземпляром его базового класса:</p>
5 &gt;&gt;&gt; isinstance(a,(float, int, str)) True &gt;&gt;&gt; isinstance(a,(list, tuple, dict)) False<p>Также следует упомянуть и другое, не менее значимое достоинство isinstance() - поддержка наследования. Для isinstance() экземпляр производного класса является экземпляром его базового класса:</p>
6 &gt;&gt;&gt; class A (list): ... pass ... &gt;&gt;&gt; a = A() &gt;&gt;&gt; type(a) == list False &gt;&gt;&gt; type(a) == A True &gt;&gt;&gt; isinstance(a,A) True &gt;&gt;&gt; isinstance(a,list) True<h2>Проверка типов</h2>
6 &gt;&gt;&gt; class A (list): ... pass ... &gt;&gt;&gt; a = A() &gt;&gt;&gt; type(a) == list False &gt;&gt;&gt; type(a) == A True &gt;&gt;&gt; isinstance(a,A) True &gt;&gt;&gt; isinstance(a,list) True<h2>Проверка типов</h2>
7 <p>Есть и ещё кое-что: во время преобразования типов данных переменных в Python нередко возникают следующие ошибки:</p>
7 <p>Есть и ещё кое-что: во время преобразования типов данных переменных в Python нередко возникают следующие ошибки:</p>
8 In [1]: int('a') ------------------------------------------------------ ValueError Traceback (most recent call last) &lt;ipython-input-42-b3c3f4515dd4&gt; in &lt;module&gt;() ----&gt; 1 int('a') ValueError: invalid literal for int() with base 10: 'a'<p>Впрочем, ошибка является вполне логичной, ведь мы пробуем преобразовать в десятичный формат строку "a“.</p>
8 In [1]: int('a') ------------------------------------------------------ ValueError Traceback (most recent call last) &lt;ipython-input-42-b3c3f4515dd4&gt; in &lt;module&gt;() ----&gt; 1 int('a') ValueError: invalid literal for int() with base 10: 'a'<p>Впрочем, ошибка является вполне логичной, ведь мы пробуем преобразовать в десятичный формат строку "a“.</p>
9 <p>Понятно, что на практике вы с такой ошибкой не столкнётесь. Однако бывает, что надо, к примеру, пробежаться по списку строк, преобразовав в числа те, которые уже содержат числа. Чтобы ошибки избежать, нужно сначала определить, с каким типом переменных мы имеем дело.</p>
9 <p>Понятно, что на практике вы с такой ошибкой не столкнётесь. Однако бывает, что надо, к примеру, пробежаться по списку строк, преобразовав в числа те, которые уже содержат числа. Чтобы ошибки избежать, нужно сначала определить, с каким типом переменных мы имеем дело.</p>
10 <p>В Python соответствующие средства, конечно, имеются. К примеру, используя метод isdigit(), мы определим, состоит ли наша строка из одних только цифр:</p>
10 <p>В Python соответствующие средства, конечно, имеются. К примеру, используя метод isdigit(), мы определим, состоит ли наша строка из одних только цифр:</p>
11 In [2]: "a".isdigit() Out[2]: False In [3]: "a10".isdigit() Out[3]: False In [4]: "10".isdigit() Out[4]: True<p>Есть и ещё один метод - isalpha(). Он проверит, состоит ли наша строка из одних лишь букв:</p>
11 In [2]: "a".isdigit() Out[2]: False In [3]: "a10".isdigit() Out[3]: False In [4]: "10".isdigit() Out[4]: True<p>Есть и ещё один метод - isalpha(). Он проверит, состоит ли наша строка из одних лишь букв:</p>
12 In [7]: "a".isalpha() Out[7]: True In [8]: "a100".isalpha() Out[8]: False In [9]: "a-- ".isalpha() Out[9]: False In [10]: "a ".isalpha() Out[10]: False<p>А вот isalnum() определит, состоит ли наша строка из цифр или букв:</p>
12 In [7]: "a".isalpha() Out[7]: True In [8]: "a100".isalpha() Out[8]: False In [9]: "a-- ".isalpha() Out[9]: False In [10]: "a ".isalpha() Out[10]: False<p>А вот isalnum() определит, состоит ли наша строка из цифр или букв:</p>
13 In [11]: "a".isalnum() Out[1]: True In [12]: "a10".isalnum() Out[12]: True<p>Но давайте снова вернёмся к упомянутой в начале статьи функции<strong>type</strong>. Порой, в зависимости от результата, функция или библиотека может выводить различные типы объектов. К примеру, если объект только один, то возвращается строка, а если их несколько, то нам возвращается кортеж. Мы же хотим построить ход программы по иному, с учётом того, что было возвращено: строка либо кортеж. И здесь как раз и пригодится type:</p>
13 In [11]: "a".isalnum() Out[1]: True In [12]: "a10".isalnum() Out[12]: True<p>Но давайте снова вернёмся к упомянутой в начале статьи функции<strong>type</strong>. Порой, в зависимости от результата, функция или библиотека может выводить различные типы объектов. К примеру, если объект только один, то возвращается строка, а если их несколько, то нам возвращается кортеж. Мы же хотим построить ход программы по иному, с учётом того, что было возвращено: строка либо кортеж. И здесь как раз и пригодится type:</p>
14 In [13]: type("string") Out[13]: str In [14]: type("string") is str Out[14]: True<p>То же самое и с кортежем, и с иными типами данных:</p>
14 In [13]: type("string") Out[13]: str In [14]: type("string") is str Out[14]: True<p>То же самое и с кортежем, и с иными типами данных:</p>
15 In [15]: type((1,2,3)) Out[15]: tuple In [16]: type((1,2,3)) is tuple Out[16]: True In [17]: type((1,2,3)) is list Out[17]: False<h2>Неизменяемые и изменяемые данные в Python</h2>
15 In [15]: type((1,2,3)) Out[15]: tuple In [16]: type((1,2,3)) is tuple Out[16]: True In [17]: type((1,2,3)) is list Out[17]: False<h2>Неизменяемые и изменяемые данные в Python</h2>
16 <p>Считается, что все типы данных в языке программирования Python можно отнести к любой из двух категорий: - изменяемые (mutable); - неизменяемые (unmutable).</p>
16 <p>Считается, что все типы данных в языке программирования Python можно отнести к любой из двух категорий: - изменяемые (mutable); - неизменяемые (unmutable).</p>
17 <p>И многие из предопределённых типов являются типами неизменяемых объектов: - символьные строки (class 'str'); - числовые данные (int, float, complex); - кортежи (tuple).</p>
17 <p>И многие из предопределённых типов являются типами неизменяемых объектов: - символьные строки (class 'str'); - числовые данные (int, float, complex); - кортежи (tuple).</p>
18 <p>Что касается других типов, то они определены как изменяемые: - множества (set), - списки (list), - словари (dict).</p>
18 <p>Что касается других типов, то они определены как изменяемые: - множества (set), - списки (list), - словари (dict).</p>
19 <p>Кроме того, вновь определяемые пользователем классы (типы) тоже можно определить как изменяемые или неизменяемые. И вообще, изменяемость объектов какого-нибудь типа считается принципиально значимой характеристикой, которая определяет, способен ли объект такого типа выступать в виде ключа для словарей (dict) либо нет.</p>
19 <p>Кроме того, вновь определяемые пользователем классы (типы) тоже можно определить как изменяемые или неизменяемые. И вообще, изменяемость объектов какого-нибудь типа считается принципиально значимой характеристикой, которая определяет, способен ли объект такого типа выступать в виде ключа для словарей (dict) либо нет.</p>
20 <p>И тут есть один интересный нюанс, связанный с самой терминологией "<strong>изменяемый-неизменяемый</strong>" (именно она используется в русскоязычном переводе). На самом деле, такой вариант названия не совсем удачный, он вносит неоднозначность. Здесь скорее бы подошёл термин "<strong>мутирующий-немутирующий</strong>", т. к. он лучше отображает суть происходящего.<strong>А суть заключается в том, способен ли объект данного типа менять свою структурность?</strong></p>
20 <p>И тут есть один интересный нюанс, связанный с самой терминологией "<strong>изменяемый-неизменяемый</strong>" (именно она используется в русскоязычном переводе). На самом деле, такой вариант названия не совсем удачный, он вносит неоднозначность. Здесь скорее бы подошёл термин "<strong>мутирующий-немутирующий</strong>", т. к. он лучше отображает суть происходящего.<strong>А суть заключается в том, способен ли объект данного типа менять свою структурность?</strong></p>
21 <p>К примеру строка s = 'abcdef' относится к неизменяемому типу, ведь в Python нельзя (это вам не C/C++) поменять какой-нибудь одиночный символ в строке, допустим, через s[ 2 ] = 'z', и это не говоря о том, чтобы вставить символ внутрь строки. Однако мы можем сделать s = s[ :2 ] + 'z' = s[ 3: ] и получить в итоге нужную строку 'abzdef', но это будет абсолютно другая строка, размещённая по абсолютно другому адресу в памяти, то есть s - переустановленная ссылка на новую строку. Однако поменять строку либо её длину (структурность) по текущей ссылке нельзя. В этом, как раз, и заключается<strong>неизменяемость объекта - неконстантность</strong>, ведь его значение поменять можно, однако это уже будет ссылка на другой объект с новым значением.</p>
21 <p>К примеру строка s = 'abcdef' относится к неизменяемому типу, ведь в Python нельзя (это вам не C/C++) поменять какой-нибудь одиночный символ в строке, допустим, через s[ 2 ] = 'z', и это не говоря о том, чтобы вставить символ внутрь строки. Однако мы можем сделать s = s[ :2 ] + 'z' = s[ 3: ] и получить в итоге нужную строку 'abzdef', но это будет абсолютно другая строка, размещённая по абсолютно другому адресу в памяти, то есть s - переустановленная ссылка на новую строку. Однако поменять строку либо её длину (структурность) по текущей ссылке нельзя. В этом, как раз, и заключается<strong>неизменяемость объекта - неконстантность</strong>, ведь его значение поменять можно, однако это уже будет ссылка на другой объект с новым значением.</p>
22 <p>На этом всё, если хотите прокачать навыки Python-программирования "по-врослому", записывайтесь на курсы в OTUS:</p>
22 <p>На этом всё, если хотите прокачать навыки Python-программирования "по-врослому", записывайтесь на курсы в OTUS:</p>
23 <p>При подготовке статьи использовались следующие материалы:</p>
23 <p>При подготовке статьи использовались следующие материалы:</p>
24 <ul><li><a>Типизация в Python. Типы данных, переменные</a>;</li>
24 <ul><li><a>Типизация в Python. Типы данных, переменные</a>;</li>
25 <li><a>Синтаксис Python: type, isinstance - определяем тип переменной</a>;</li>
25 <li><a>Синтаксис Python: type, isinstance - определяем тип переменной</a>;</li>
26 <li><a>Проверка типов</a>;</li>
26 <li><a>Проверка типов</a>;</li>
27 <li><a>Тонкости использования языка Python: типы данных</a>.</li>
27 <li><a>Тонкости использования языка Python: типы данных</a>.</li>
28 </ul>
28 </ul>