@Станиславе, нищо подобно. id-тата не се губят току така.
След седмица-две ще има по-advanced лекция за мета обектния протокол на езика и тогава ще ви се обясни това.
Засега накратко: Казахме ви, че is просто сравнява id-тата на два обекта. Истината е, че той не е толкова наивен. Когато се създаде нова инстанция на даден клас, не се копират всичките му методи и атрибути на ново място, поради очевидни причини. Т.е. когато извикаш a.f() се извиква въпросния метод A.f и му се подава инстанцията на a като първи аргумент. Същото се случва и с b.f(). Извиква се едно и също парче код, върху различни обекти.
Ако погледнем в паметта (както прави id) тези два метода са едно и също нещо. Но реално - не са, тъй като се извикват върху два различни обекта. Дължината на котка и куче няма как да са едно и също нещо (дори по стойност да съвпаднат), предвид факта, че ги изпълняваме върху два различни обекта. И is прави разликата.
Ето ви обаче малко храна за размисъл. Ако това, което ви казах е вярно, някой може ли да ми обясни защо тези двете са с различен адрес в паметта?
>>> id(A.f)
<<< 139964990037744
>>> id(a.f)
<<< 139964990004616