Когда вы говорите
print id(A()) == id(A())
вы создаете объект типа A
и передавая ее id
функции. Когда функция возвращается, нет ссылок на этот объект, созданный для параметра. Таким образом, счетчик ссылок становится равным нулю, и он становится готовым к сбору мусора.
Когда вы делаете id(A())
в том же выражении снова, вы пытаетесь создать другой объект того же типа. Теперь Python может попытаться повторно использовать ту же ячейку памяти, которая использовалась для предыдущего созданного объекта (если он уже собран мусором). В противном случае он создаст его в другом месте. Таким образом, id
может быть или не быть одинаковым.
Если вы,
print A() is A()
Мы создаем объект типа A
и мы пытаемся сравнить его с другим объектом типа A
. Теперь в этом выражении все еще упоминается первый объект. Таким образом, он не будет помечен для сбора мусора, и поэтому ссылки будут разными.
Предложение: Никогда не делайте ничего подобного в производственном кодексе.
Цитируя docs,
Благодаря автоматической сборки мусора, бесплатные списки и динамической природы дескрипторов, вы можете заметить, на первый взгляд необычное поведение в определенных видов использования является оператором, как которые включают сравнения между методами экземпляра или константами. Проверьте их документацию на .
См. Http://stackoverflow.com/questions/2906177/what-is-the-difference-between-a-is-b-and-ida-idb-in-python –