2015-09-24 10 views
6

Rozumiem, że python wbudowany w id() zwraca identyfikator, który jest unikalny przez cały okres istnienia obiektu. Uważam, że obiekty z nie nakładającymi się okresami życia mogą mieć ten sam identyfikator. Jednak staram się zrozumieć to dość kłopotliwe zachowanie:Powtarzalne zderzenia id na obiektach Pythona

>>> id(matplotlib.image.BboxImage.set_cmap) 
4424372944 
>>> id(numpy.ma.core.MaskedArray.sum) 
4424372944 

A w rzeczywistości w wielu przypadkach tłumaczy zachowanie jest powtarzalny:

Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)" 
4343186208 4343186208 
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)" 
4521153312 4521153312 
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)" 
4358591264 4358591264 
Mac:~$ python2.7 -c "import matplotlib.image; import numpy; print id(matplotlib.image.BboxImage.set_cmap), id(numpy.ma.core.MaskedArray.sum)" 
4389970720 4389970720 

Wydaje się, że matplotlib.image.BboxImage.set_cmap i numpy.ma.core.MaskedArray.sum zawsze ten sam identyfikator jak siebie nawzajem, nawet w różnych instatiations python interpreter.

Teraz rozumiem, że jest to zgodne z dokumentami dla id(), ponieważ te dwa obiekty są tworzone dynamicznie po uzyskaniu dostępu i tak naprawdę będą mieć nie nakładające się okresy życia. Ale dlaczego te dwa niepowiązane obiekty zawsze kończyłyby się tym samym identyfikatorem?

(To pytanie jest inny Object methods of same class have same id? ponieważ tutaj pytam, dlaczego ten jest powtarzalny w wielu przypadkach tłumaczy, a nie tylko pozornej id starcia na obiektach z wcieleń niewyspecjalizowanych nakładających.)

Odpowiedz

6

To będzie prawdziwa of dowolna metoda instancji, która jest typem obydwu testowanych obiektów. Za każdym razem, gdy uzyskujesz dostęp do deskryptora, tworzony jest nowy obiekt instancemethod. Ponieważ nie zapisujesz odniesienia do nowo utworzonej metody, jest ona uprawniona do zbierania śmieci, gdy tylko zwróci id i jest najwyraźniej zbierana przed następnym wywołaniem id, więc ta sama lokalizacja pamięci może być ponownie wykorzystana.

Takie zachowanie może być postrzegane w inny sposób:

>>> x = matplotlib.image.BboxImage.set_cmap 
>>> y = matplotlib.image.BboxImage.set_cmap 
>>> id(x) == id(y) 
False 

x i y są odniesienia do dwóch różnych przedmiotów, ponieważ przedstawieniu set_cmap tworzy nowy instancemethod obiektu za każdym razem.

Powiązane problemy