IはCPythonの2.xおよび3.xに、いくつかの整数でシングルトンである、ことを理解する:従って予期参照カウントリテラル
>>> a = 256; a is 256 # or any integer from -5 to 256
True
>>> a = 257; a is 257 # or any other integer outside the magic range
False
、私は範囲の整数でsys.getrefcount
を実行する場合、-5なぜなら、引数への自身参照の、
>>> sys.getrefcount(1)
1470
は、私はまた、より多くのsys.getrefcount
1を返しますが、あなたが想像するよりことを理解:256に、私は私のインポートされたパッケージの多くは、その整数を参照していることがわかります:
>>> sys.getrefcount(257)
3
なぜ3、ではない2:
>>> a = 257; sys.getrefcount(a)
2
私は何を得ることはありませんがこのですか?私は自分のスコープ(カウント1)に一時変数を作成している可能性があり、明らかにsys.getrefcount
はそれ自身の別のリファレンスを(カウント2)追加しますが、3番目はどこから来たのですか?前の例で起こりますか?さらに重要なことは、これが起こるかもしれない他の状況があり、sys.getrefcount
出力の誤解を招く可能性があるということですか?
上記のすべては、OSX上で動作するAnacondaの64ビットPython 2.7.12および3.5.1とWindows上で動作する32ビットPython 2.7.5ディストリビューションでも複製可能です。しかし、古いPythonバージョン(Windowsの32ビットPython 2.5.4)では、sys.getrefcount(257)
が2を返します。これは(私にとっては)より期待されています。
重要ですか?実装の詳細は、定数としてキャッシュされる不変のリテラルにつながる場合もあれば、そうでない場合もあります。 –
ドキュメントから、*オブジェクトの参照カウントを返します。返されるカウントは、getrefcount()への引数として(一時的な)参照が含まれているため、一般的に予想以上のものが返されます* –
@HunterMcMillen:これは3つの参照のうち2つであり、遠い –