Actually not related. The case in the article is about late-binding methods to object instances (creating a new object on each access) - whereas in python 2 the &quot;unbound method&quot; was a lazy creation on access, and in python 3 an unbound method is just a reference to a bare function in the class&#x27; name space. The lazy evaluation is from the descriptor protocol in python (see the links in TLA).<p>The case you point out is because the python bytecode compiler will intern raw values for some items - e.g. string literals, some integer values, and so on. More on interning: <a href="https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;String_interning" rel="nofollow">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;String_interning</a>