На этом шаге мы рассмотрим особенности выполнения присваивания.
В языке Python используется динамическая типизация. Это означает, что при присваивании переменной значения интерпретатор автоматически относит переменную к одному из типов данных. Значение переменной присваивается с помощью оператора = таким образом:
>>> x = 7 # Тип int >>> y = 7.8 # Тип float >>> s1 = "Строка" # Переменной s1 присвоено значение Строка >>> s2 = 'Строка' # Переменной s2 тоже присвоено значение Строка >>> b = True # Переменной b присвоено логическое значение True
В одной строке можно присвоить значение сразу нескольким переменным:
>>> x = y = 10
>>> x, y
(10, 10)
После присваивания значения в переменной сохраняется ссылка на объект, а не сам объект. Это обязательно следует учитывать при групповом присваивании. Групповое присваивание можно использовать для чисел, строк и кортежей, но для изменяемых объектов этого делать нельзя. Пример:
>>> x = y = [1, 2] # Якобы создали два объекта >>> x, y ([1, 2], [1, 2])
В этом примере мы создали список из двух элементов и присвоили значение переменным х и у. Теперь попробуем изменить значение в переменной у:
>>> y[1] = 100 # Изменяем второй элемент >>> x, y ([1, 100], [1, 100])
Как видно из примера, изменение значения в переменной у привело также к изменению значения в переменной х. Таким образом, обе переменные ссылаются на один и тот же объект, а не на два разных объекта. Чтобы получить два объекта, необходимо производить раздельное присваивание:
>>> x = [1, 2] >>> y = [1, 2] >>> y[1] = 100 # Изменяем второй элемент >>> x, y ([1, 2], [1, 100])
Проверить, ссылаются ли две переменные на один и тот же объект, позволяет оператор is. Если переменные ссылаются на один и тот же объект, то оператор is возвращает значение True:
>>> x = y = [1, 2] # Один объект >>> x is y True >>> x = [1, 2] # Разные объекты >>> y = [1, 2] # Разные объекты >>> x is y False
Следует заметить, что в целях повышения эффективности кода интерпретатор производит кэширование малых целых чисел и небольших строк. Это означает, что если ста переменным присвоено число 2, то в этих переменных будет сохранена ссылка на один и тот же объект. Пример:
>>> x = 2; y = 2; z = 2 >>> x is y, y is z (True, True)
Посмотреть количество ссылок на объект позволяет метод getrefcount () из модуля sys:
>>> import sys # Подключаем модуль sys >>> sys.getrefcount(2) 472
Когда число ссылок на объект становится равно нулю, объект автоматически удаляется из оперативной памяти. Исключением являются объекты, которые подлежат кэшированию.
На следующем шаге мы закончим изучение этого вопроса.