4

これらのコードスニペットのpythonインタープリターで何が起こっているのか、少し混乱しています... python 2.7.3の32ビットバージョンを使用しています

class A:
    def func(self):
        print 'in func'


>>> A.func
>>> <unbound method A.f>
>>> A.__dict__['func']
>>> <function func at 0x013DF9B0>
>>> a = A()
>>> a.func
>>> <bound method A.func of <__main__.A instance at 0x014076C0>>

ここまではすべて問題ありません...しかし、次のコードスニペットの結果について混乱しています... Python 2.7.3で

(1)

>>> A.__dict__['func'] is A.func
>>> False
>>> A.func is A.func
>>> False
>>> a.func is A.func
>>> False
>>> a.func is a.func
>>> False

クラス オブジェクト (A) が 1 つしかなく、クラス タイプ (a) のオブジェクトのインスタンスが 1 つしかないにもかかわらず、すべてが False を返す理由。

(2)

>>> id(A.func)
>>> 20953208
>>> id(A.func)
>>> 20954728
>>> id(A.func)
>>> 20960080

(3)

>>> id(a.func)
>>> 20954288
>>> id(a.func)
>>> 20952888
>>> id(a.func)
>>> 20954728 

(2) と (3) の場合、ID を何度も変更する理由は... この関数は指定されたメモリ位置に格納されていないためです。

しかし、ブロック (1) の同じコードは、Python 3.3.1 の 32 ビット バージョンでこの結果を示します。

>>> A.__dict__['func'] is A.func
>>> True
>>> A.func is A.func
>>> False
>>> a.func is A.func
>>> False
>>> a.func is a.func
>>> False

これらの結果がPythonの異なるバージョンでどのように異なるのか、そして同じバージョンのPythonでもなぜ異なるのか、詳細を教えてもらえますか...

4

1 に答える 1