Я столкнулся с поведением Python, которое мне кажется очень странным, и я хотел бы это понять.Применение `id` к методу всегда отличается в IPython. Может ли кто-нибудь объяснить это странное поведение?
Обычно я ожидаю, что функция id
всегда возвращает одно и то же значение, когда я передаю ему тот же объект. В CPython это соответствует расположению объекта в памяти.
Когда я создаю объект и применяю id
, результат всегда один и тот же, но когда я использую id
по связанному методу объекта, результат изменяется. Почему это? Является ли новый метод создаваемым каждый раз, когда я получаю атрибут метода?
Я впервые заметил это в IPython, но было сложнее создать скрипт, который показывает то же поведение. Может быть, это частично IPython?
Мне удалось написать небольшой блок, который частично воссоздает поведение.
# Create an object
class Foo(object):
def bar(self):
pass
obj = Foo()
for _ in range(10):
print(id(obj))
# ... prints the same number
for _ in range(10):
print(id(obj.bar))
# ... in this case the first number is different and the rest are the same
Это немного отличается, чем просто вставить строку print(id(obj.bar))
в IPython кучу раз, потому что возвращаемые идентификаторы в основном последовательны. Однако, когда я просто запускаю вышеуказанный код как скрипт python, все числа одинаковы, поэтому кажется, что это причуда IPython. Наверное, сейчас вопрос: почему?
Не удается воспроизвести я у IPython (5.1.0) и версию питона (2.7.6). Какую версию Python вы используете и какую версию IPython? –
@JayAtkinson интересный. I * am * способен воспроизводить с помощью ipython 5.1.0 с Python 2.7.12 – elethan
Не отмечать как дублирующее, но, поскольку я не уверен, что они одинаковы, но, конечно же, связаны: http://stackoverflow.com/q/26201305/3642398 – elethan