«
»
Python

Объекты, переменные и функции в Python – Отладчики

Имена и объекты Python

Люди, начинающие Python, могут быть смущены его довольно уникальным подходом к переменным и значениям. Как хранятся объекты? Как переменные передаются в функции?

В Python все является объектом. Любой список, или кортеж, или строка является объектом. Функции, типы и даже литералы являются объектами. Например, в таких языках, как C, «7» является числовой константой. Это значение для хранения в переменной. Но в Python это экземпляр числового типа int и сам по себе объект, а не только числовой литерал.

Сравните это:

int foo = 7;

с этим:
bar = 7

Первый блок кода имеет оператор C, который присваивает значение 7 переменной foo.
Второй блок содержит инструкцию Python, которая привязывает объект 7 к строке имени или идентификатора.
Предположим, мы делаем следующее:

bar = 42

Затем мы просто привязываем строку имени к другому объекту (другому числовому литералу).

Каждый объект уникален и имеет уникальное идентифицирующее значение, которое возвращается функцией id . Например:

list_1 = [1, 2, 'spam'] tuple_1 = ('300 yen', 42) x = 7 y = 7 print(id(list_1), id(tuple_1)) print(id(x), id(y))

Вышеприведенный фрагмент дает следующий результат:

139919612658888 139919612659848 139919612658888 139919612659848

Идентификатор объекта гарантированно будет постоянным и уникальным в течение своей жизни.
Обратите внимание, что значение id одинаково, когда мы передаем переменные x и y ему. Это потому, что они связаны с одним и тем же объектом.

Функция type , как следует из ее названия, возвращает тип объекта, переданного ей.

Мы можем дополнительно использовать оператор is, чтобы проверить, относятся ли два имени к одному и тому же объекту.

Рассмотрим следующий фрагмент:
spam = [1,2,3] ham = spam print(spam) print(ham is spam) ham[0] = "a" print(spam) foo = spam[:] print(foo is spam)

Вывод:
[1, 2, 3] True ['a', 2, 3] False

После второй строки и спам, и ветчина ссылаются на один и тот же объект. Таким образом, если мы применяем метод append для ham, список, на который указывает спам, также изменяется. Напротив, предпоследняя строка объединяет исходный список, так что foo и spam ссылаются на списки, которые имеют одинаковое значение, но по существу являются разными объектами.

Переменчивость

Объекты явно двух типов: изменяемые и неизменяемые.

Значения изменяемых объектов могут быть изменены. Списки, наборы и словари – это некоторые изменяемые типы.

foo_list = [1, 2, 3, 4, 5] print(foo_list, id(foo_list)) foo_list.append("shrubbery") print(foo_list, id(foo_list))

Мы использовали метод добавления для изменения списка.
Код выше дает вывод:

[1, 2, 3, 4, 5] 139921008629000 [1, 2, 3, 4, 5, 'shrubbery'] 139921008629000

Обратите внимание, что идентификатор списка остается неизменным даже при изменении его значения.

То же самое нельзя сказать о неизменных объектах. У кортежей нет метода, подобного append, для изменения объекта кортежа. Вы можете вернуть только новый объект кортежа из старого, но вы никогда не сможете изменить его значение. Однако вы можете «изменить» значение кортежа, изменив значение изменяемого типа, содержащегося в нем.

li = [] tup = (1, "spam", li) print(tup, id(tup)) li.append(5) print(tup, id(tup))

Вывод:
(1, 'spam', []) 139999533869672 (1, 'spam', [5]) 139999533869672

Идентификатор кортежа такой же. Это потому, что li является изменяемым типом, и только его значение было изменено. Кортеж строк все еще содержит один и тот же объект списка. Следовательно, оно остается практически неизменным.

Python Функции и объекты

Как переменные передаются в функции в Python? Получает ли функция локальную копию или напрямую получает ссылку на сам объект?

В Python относительно функций термины, передаваемые по ссылке и передаваемые по значению , не имеют большого значения. Когда мы передаем переменную / имя в качестве аргумента функции, сам объект передается функции. Если объект является изменяемым, функция может изменить свое значение, и если он является неизменным, она может просто прочитать значение.

Демонстрация:

x = [1, 2, 3] print("x is ", id(x)) def f(z): x = ["another", "list"] z.append("thanks") print("z is ", id(z)) return z y = f(x) print(x is y) print(x)
Вывод:

x is 139793733100744 local x is 139793733100808 z is 139793733100744 True [1, 2, 3, 'thanks']

Как видите, функция f изменила и вернула переданный ей список.
Локальная переменная функции x с тем же именем является совершенно другим объектом и не влияет на исходную переменную, поскольку находится в другой области видимости.

Надеюсь, это прояснит ситуацию.

Источник записи: https://thedebuggers.com

Связанные записи
Python

Python - Разработка игр для начинающих на Pygame

Python

Функциональное программирование на Python

Python

Введение в Python для начинающих