Что такое функция id в Python?
Функция id() возвращет уникальный идентификатор переданного ей в качестве аргумента объекта. Этот идентификатор является адресом в памяти, по которому расположен сам объект. При каждом запуске программы этот идентификатор создается заново и будет для одного и того же объекта разным, за исключением случаев, когда у объектов есть свой постоянный уникальный id, как, например, у целых чисел от -5 до 256 — для них id будет одним и тем же при каждом вызове функции id() .
x = ('apple', 'banana', 'cherry') y = id(x) print(y) # => 23349413042176 # это значение будет меняться при каждом # вызове функции для одного и того же объекта.
Что такое объект в Python. Почему id(a) == id(b) == id(1)?
Детализирую вопрос.
В книгах по Python пишут, что все в Python есть объект. Берем традиционный подход к изучению/обучению языкам программирования. Языки Pascal, C, C++, у них есть понятие «имя переменной» (идентификатор). С именем переменной связывается/присваивается значение. Значение хранится в памяти. Имя переменной — это способ (в исходном тексте программы) обратиться к ячейке памяти для получения значения, которое там хранится. Не знаю верно ли высказывание (для компилируемых языков): Для переменных, например, целого типа, в момент выполнения программы на компьютере, процессор работает уже с адресами ячеек памяти, где хранятся значения переменных. Т.е. не такого, что где-то по какому-то адресу хранится имя переменной и оно связывается с адресом ячейки, в которой хранится значение. Теперь переходим к Python. В этом языке все является объектом, даже определение функции.
Переменная объект, значение объект и т.д. В разное время с одним и тем же объектом может соотноситься разный другой объект.
a = 1 print(a) a = "Hello" print(a)
Но тогда как понять действие функции id() ? По определению стандарта она возвращает «identify» указанного объекта. Причем, «возвращает целое, гарантированно являющееся уникальным» и постоянным для объекта на время его существования.» Тогда почему
a = 1 b = 1 print(id(a) == id(b) == id(1)) # True print("Why?")
ведь a, b, 1 разные объекты?
По-моему вопрос получился. Используется Python 3.6 Про значения от -5 до 256 наслышан. Имеет место быть
a = 1000000 b = 1000000 print(id(a) == id(b)) # True print("Why?")
На счет того, что достаточно «знать об именах и т.д.». Для меня не достаточно, потому и спрашиваю у уважаемых профи. В Питоне все объект. Нет имен переменных. Отсюда и мой вопрос.
Функция id() в Python
Функция id() в Python возвращает «идентичность» объекта. Идентификатор объекта – это целое число, которое гарантированно будет уникальным и постоянным для этого объекта в течение его жизненного цикла.
Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id(). В реализации CPython это адрес объекта в памяти.
Python кеширует значение id() часто используемых типов данных, таких как строка, целое число, кортежи и т.д. таким образом, вы можете обнаружить, что несколько переменных относятся к одному и тому же объекту и имеют одинаковое значение id(), если их значения совпадают.
Давайте проверим это на примере.
# integers a = 10 b = 10 c = 11 d = 12 print(id(a)) print(id(b)) print(id(c)) print(id(d))
4317900064 4317900064 4317900096 4317900128
Обратите внимание, что значения id() для ‘a’ и ‘b’ одинаковы, они имеют одинаковое целочисленное значение.
Посмотрим, получим ли мы подобное поведение со строками и кортежами?
# tuples t = ('A', 'B') print(id(t)) t1 = ('A', 'B') print(id(t1)) # strings s1 = 'ABC' s2 = 'ABC' print(id(s1)) print(id(s2))
4320130056 4320130056 4320080816 4320080816
Из выходных данных ясно, что Python кэширует объекты строк и кортежей, и использует их для экономии места в памяти.
Мы знаем, что словарь не является неизменным, давайте посмотрим, отличается ли id() для разных словарей, даже если элементы одинаковы?
# dict d1 = d2 = print(id(d1)) print(id(d2))
4519884624 4519884768
Как мы думали, объекты dict возвращают другое значение id() и, похоже, здесь нет кеширования.
Для настраиваемого объекта
Давайте посмотрим на простой пример получения значения id() для настраиваемого объекта.
class Emp: a = 0 e1 = Emp() e2 = Emp() print(id(e1)) print(id(e2))
4520251744 4520251856
Id python что это
Возвращает целое, гарантированно являющееся уникальным и постоянным для объекта на время его существования.
Таким образом, объекты, периоды существования которых не пересекаются, могут иметь одинаковый идентификатор.
Заметки к реализации из CPython
Идентификатор является адресом объекта в памяти.
Следует иметь в виду, что некоторые объекты могут иметь один и тот же идентификатор, например: мелкие целые (с -5 по 256), True и False.
a = 1
b = 1
id(a) == id(b) # True
a = 257
b = 257
id(a) == id(b) # False