Поиск по блогу

суббота, 11 января 2014 г.

Интерлюдия о динамической типизации (по гл. 6 из М. Лутца...)

Если у вас имеется опыт работы с компилирующими языками или с языками, обладающими статической типизацией, такими как C, C++ или Java, вероятно, эта тема в книге вызовет у вас недоумение. Мы все время использовали переменные, не объявляя ни их самих, ни их типы, и все как-то работало. Например, когда вводится инструкция a = 3 в интерактивной оболочке интерпретатора или в файле сценария, как интерпретатор Python узнает, что речь идет о целом числе? И вообще, как Python узнает, что есть что?

Создание переменной

Переменная (то есть имя), такая как a, создается автоматически, когда в программном коде ей впервые присваивается некоторое значение. Все последующие операции присваивания просто изменяют значение, ассоциированное с уже созданным именем. Строго говоря, интерпретатор Python определяет некоторые имена до запуска программного кода, но вполне допустимо думать, что переменные создаются первой операцией присваивания.

Типы переменных

Переменные не имеют никакой информации о типе или ограничениях, связанных с ним. Понятие типа присуще объектам, а не именам. Переменные универсальны по своей природе – они всегда являются всего лишь ссылками на конкретные объекты в конкретные моменты времени.

Использование переменной

Когда переменная участвует в выражении, ее имя замещается объектом, на который она в настоящий момент ссылается, независимо от того, что это за объект. Кроме того, прежде чем переменную можно будет использовать, ей должно быть присвоено значение – использование неинициализированной переменной приведет к ошибке.
не требуется заранее объявлять переменные в сценарии, но вы должны инициализировать их перед использованием – счетчик, например, должен быть инициализирован нулевым значением, прежде чем его можно будет наращивать.
In []:
a=3
In [1]:
from IPython.display import Image
Image(filename='C:\\Users\\kiss\\Pictures\\for_blogs\\py_din.PNG')
Out[1]:
Имена и объекты после выполнения операции присваивания a = 3.  Переменная превращается в ссылку на объект 3.  Во внутреннем представлении переменная в действительности является указателем на пространство памяти с объектом, созданным в результате интерпретации литерального выражения 3 В конкретных терминах: • Переменные – это записи в системной таблице, где предусмотрено место для хранения ссылок на объекты. • Объекты – это области памяти с объемом, достаточным для представления значений этих объектов. • Ссылки – это автоматически разыменовываемые указатели на объекты.
С технической точки зрения объекты имеют более сложную структуру, чем просто пространство в памяти, необходимое для хранения значения.
Каждый объект имеет два стандартных поля:
описатель типа, используемый для хранения информации о типе объекта, и
счетчик ссылок, используемый для определения момента, когда память, занимаемая объектом, может быть освобождена.
Итак, типы в языке Pythonon – это свойства объектов, а не переменных. В типичном программном коде переменная обычно ссылается на объекты только одного типа. Т. к. для языка Python это не является обязательным требованием, программный код на языке Python обладает более высокой гибкостью, чем вам может показаться, – при умелом использовании особенностей языка программный код смог бы работать со многими типами автоматически.
Всякий раз, когда имя ассоциируется с новым объектом, интерпретатор Python освобождает память, занимаемую предыдущим объектом (если на него не ссылается какое-либо другое имя или объект). Такое автоматическое освобождение памяти, занимаемой объектами, называется сборкой мусора (garbage collection).
Строго говоря, механизм сборки мусора в основном опирается на счетчики ссылок, как было описано выше, однако он способен также обнаруживать и удалять объекты с циклическими ссылками. Эту особенность можно отключить, если вы уверены, что в программе не создаются объекты с циклическими ссылками, но по умолчанию она включена.
In []:
a = 3
b = a
In [2]:
Image(filename='C:\\Users\\kiss\\Pictures\\for_blogs\\py_din_1.PNG')
Out[2]:
Переменные в языке Python, в отличие от других языков программирования, всегда являются указателями на объекты, а не метками областей памяти, доступных для изменения:
запись нового значения в переменную не приводит к изменению первоначального объекта,
но приводит к тому, что переменная начинает ссылаться на совершенно другой объект.
In []:
x = 42
x = shrubbery # Объект 42 теперь уничтожен?
Так как интерпретатор Python кэширует и повторно использует малые целые числа и небольшие строки, о чем уже упоминалось ранее, объект 42 скорее всего не будет уничтожен.
Он, вероятнее всего, останется в системной таблице для повторного использования, когда вы вновь сгенерируете число 42 в программном коде.
Однако большинство объектов уничтожаются немедленно, как только будет потеряна последняя ссылка, особенно те, к которым применение механизма кэширования не имеет смысла.

Комментариев нет:

Отправить комментарий