जवाबों:
अजगर के मैनुअल इस बारे में क्या कहना है id()
:
किसी ऑब्जेक्ट की "पहचान" लौटाएं। यह एक पूर्णांक (या लंबा पूर्णांक) है जो इस वस्तु के लिए अपने जीवनकाल के दौरान अद्वितीय और स्थिर रहने की गारंटी है। गैर-अतिव्यापी जीवनकाल वाली दो वस्तुओं का एक ही आईडी () मान हो सकता है। (कार्यान्वयन नोट: यह ऑब्जेक्ट का पता है।)
तो सीपीथॉन में, यह ऑब्जेक्ट का पता होगा। हालांकि किसी भी अन्य पायथन दुभाषिया के लिए ऐसी कोई गारंटी नहीं है।
ध्यान दें कि यदि आप C एक्सटेंशन लिख रहे हैं, तो आपके पास सीधे वस्तुओं के पते तक पहुंच सहित पायथन दुभाषिया के आंतरिक तक पूर्ण पहुंच है।
lifetime
क्या (और जीवनकाल के लिए क्या मतलब है overlap/not overlap
) इसका संदर्भ देता है?
आप इस तरह से डिफ़ॉल्ट पुन: लागू कर सकते हैं:
def __repr__(self):
return '<%s.%s object at %s>' % (
self.__class__.__module__,
self.__class__.__name__,
hex(id(self))
)
return object.__repr__(self)
है, object.__repr__(obj)
तब भी आप सिर्फ या केवल कर सकते हैं
__repr__ = object.__repr__
, और लगभग मूर्ख प्रमाण के रूप में नहीं है, क्योंकि ऐसी स्थितियों की एक किस्म है जहाँ यह काम नहीं करता है, उदाहरण के लिए एक overrided __getattribute__
या एक गैर- CPython कार्यान्वयन जहां आईडी नहीं है स्मृति स्थान। यह z-fill भी नहीं करता है, इसलिए आपको यह काम करना होगा यदि सिस्टम 64bit है और आवश्यकतानुसार शून्य जोड़ दें।
महज प्रयोग करें
id(object)
id()
@ जेएलटी
यहाँ कुछ मुद्दे हैं जो किसी भी अन्य उत्तर द्वारा कवर नहीं किए गए हैं।
सबसे पहले, id
केवल रिटर्न:
किसी वस्तु की "पहचान"। यह एक पूर्णांक (या लंबा पूर्णांक) है जो अपने जीवनकाल के दौरान इस वस्तु के लिए अद्वितीय और स्थिर रहने की गारंटी है। गैर-अतिव्यापी जीवनकाल वाली दो वस्तुओं का समान
id()
मूल्य हो सकता है ।
CPython में, यह सूचक के लिए होता है जो PyObject
कि दुभाषिया में वस्तु का प्रतिनिधित्व करता है, जो कि वही वस्तु है , जो स्पष्ट रूप से एक सूचक नहीं बनने जा रही है। मुझे आयरनपाइथन के बारे में निश्चित नहीं है, लेकिन मुझे संदेह है कि इस संबंध में सीपीथॉन की तुलना में यह ज्येथोन की तरह अधिक है। इसलिए, अधिकांश पायथन कार्यान्वयन में, जो कुछ भी दिखाया गया है उसे पाने का कोई तरीका नहीं है , और यदि आपने किया तो कोई फायदा नहीं है।object.__repr__
प्रदर्शित करता है। लेकिन यह केवल CPython का कार्यान्वयन विवरण है, न कि कुछ ऐसा जो सामान्य रूप से अजगर का सच है। Jython पॉइंटर्स में डील नहीं करता है, यह Java रेफरेंस में डील करता है (जो कि बेशक JVM पॉइंटर्स के रूप में प्रतिनिधित्व करता है, लेकिन आप उन लोगों को नहीं देख सकते - और नहीं चाहेंगे, क्योंकि जीसी को उन्हें स्थानांतरित करने की अनुमति है)। PyPy विभिन्न प्रकारों को अलग-अलग प्रकार की अनुमति देता है id
, लेकिन सबसे सामान्य वस्तुओं की एक तालिका है जिसे आपने कहा हैid
repr
लेकिन क्या होगा यदि आप केवल सीपीथॉन के बारे में परवाह करते हैं? यह एक बहुत ही आम मामला है, सब के बाद।
ठीक है, पहले, आप देख सकते हैं कि id
पूर्णांक है; * यदि आप 0x2aba1c0cf890
संख्या के बजाय उस स्ट्रिंग को चाहते हैं 46978822895760
, तो आपको इसे स्वयं प्रारूपित करना होगा। कवर के तहत, मेरा मानना है कि object.__repr__
अंत में उपयोग कर रहा है printf
के %p
प्रारूप है, जो आप अजगर से नहीं है ... लेकिन आप हमेशा ऐसा कर सकते हैं:
format(id(spam), '#010x' if sys.maxsize.bit_length() <= 32 else '#18x')
* 3.x में, यह एक है int
। 2.x में, यह एक ऐसा है जो int
एक पॉइंटर को पकड़ने के लिए काफी बड़ा है - जो कि कुछ प्लेटफार्मों पर हस्ताक्षरित संख्या के मुद्दों के कारण नहीं हो सकता है- और long
अन्यथा।
वहाँ कुछ भी आप इन संकेत के साथ कर सकते हैं इसके अलावा उन्हें बाहर प्रिंट? ज़रूर (फिर से, आप केवल सीपीथॉन के बारे में ध्यान रखते हैं)।
C API फ़ंक्शन के सभी एक PyObject
या एक संबंधित प्रकार के लिए एक पॉइंटर लेते हैं । उन संबंधित प्रकारों के लिए, आप बस PyFoo_Check
यह सुनिश्चित करने के लिए कॉल कर सकते हैं कि यह वास्तव में एक Foo
ऑब्जेक्ट है, फिर के साथ कास्ट करें (PyFoo *)p
। इसलिए, यदि आप C एक्सटेंशन लिख रहे हैं, तो id
ठीक वही है जो आपको चाहिए।
क्या होगा अगर आप शुद्ध पायथन कोड लिख रहे हैं? आप के साथ ठीक उसी कार्यों कॉल कर सकते हैं pythonapi
से ctypes
।
अंत में, कुछ अन्य उत्तर सामने आए हैं ctypes.addressof
। यह यहाँ प्रासंगिक नहीं है। यह केवल ctypes
वस्तुओं के लिए काम करता है जैसे c_int32
(और शायद कुछ मेमोरी-बफर जैसी वस्तुएं, जैसे प्रदान की गई numpy
)। और, वहां भी, यह आपको c_int32
मूल्य का पता नहीं दे रहा है , यह आपको सी-लेवल का पता दे रहा है int32
जो कि c_int32
लपेटता है।
यह कहा जा रहा है, अधिक बार नहीं, यदि आप वास्तव में सोचते हैं कि आपको किसी चीज़ के पते की आवश्यकता है, तो आप पहली जगह में एक देशी अजगर वस्तु नहीं चाहते थे, आप एक ctypes
वस्तु चाहते थे ।
id
एक seen
सेट या एक निश्चित में परस्पर मूल्यों को धारण करने के लिए उन्हें उपयोग करने के अन्य उपयोग - एक सूचक होने cache
पर किसी भी तरह से निर्भर नहीं करता है id
, या किसी भी तरह से संबंधित है repr
। ठीक यही कारण है कि इस तरह के कोड सभी पायथन कार्यान्वयन में काम करते हैं, बजाय केवल सीपीथॉन में काम करने के।
id
लिए इस्तेमाल किया , लेकिन मेरा मतलब है कि अभी भी जावा में आप ऑब्जेक्ट का पता प्राप्त कर सकते हैं, अजीब लगता है कि (सी) पायथन में कोई रास्ता नहीं है क्योंकि एक वास्तव में स्थिर जीसी है जो वस्तुओं को स्थानांतरित नहीं करेगा इस प्रकार पता वही रहता है
id
, चाहे वह पता हो या नहीं। उदाहरण के लिए, PyPy में, id
अभी भी CPython में एक कुंजी के रूप में उपयोगी है, भले ही यह आमतौर पर कार्यान्वयन में कुछ छिपी हुई तालिका में एक सूचकांक है, लेकिन एक संकेतक बेकार होगा, क्योंकि (जावा की तरह) ऑब्जेक्ट को अंदर ले जाया जा सकता है स्मृति।
id
ऑब्जेक्ट का मेमोरी में ऑब्जेक्ट के स्थान का सूचक है। तो, यदि आपके पास पॉइंटर मूल्य के लिए कोई उपयोग है (जो आप लगभग कभी नहीं करते हैं, जैसा कि उत्तर में भी बताया गया है) सीपीथॉन-विशिष्ट कोड में, इसे प्राप्त करने का एक तरीका है जो दस्तावेज और काम की गारंटी है।
टॉर्स्टन के जवाब में, मैं addressof()
एक नियमित अजगर वस्तु पर कॉल करने में सक्षम नहीं था । इसके अलावा, id(a) != addressof(a)
। यह सीपीथॉन में है, किसी और चीज के बारे में नहीं जानते।
>>> from ctypes import c_int, addressof
>>> a = 69
>>> addressof(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: invalid type
>>> b = c_int(69)
>>> addressof(b)
4300673472
>>> id(b)
4300673392
Ctypes के साथ , आप उसी चीज़ को प्राप्त कर सकते हैं
>>> import ctypes
>>> a = (1,2,3)
>>> ctypes.addressof(a)
3077760748L
प्रलेखन:
addressof(C instance) -> integer
C आवृत्ति आंतरिक बफ़र का पता लौटाएँ
ध्यान दें कि वर्तमान में सीपीथॉन में id(a) == ctypes.addressof(a)
, लेकिन ctypes.addressof
प्रत्येक पायथन कार्यान्वयन के लिए वास्तविक पता वापस करना चाहिए, यदि
संपादित करें : ctypes की दुभाषिया-स्वतंत्रता के बारे में जानकारी जोड़ी गई
TypeError: invalid type
जब मैं पायथन 3.4 के साथ प्रयास करता हूं तो परिणाम होता है।
आप उस उद्देश्य के लिए उपयुक्त कुछ प्राप्त कर सकते हैं:
id(self)
मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर आप अभी भी प्रोग्रामिंग में हैं, तो इन दिनों अजगर 3 में ... मैंने वास्तव में पाया है कि अगर यह एक स्ट्रिंग है, तो ऐसा करने का एक बहुत आसान तरीका है:
>>> spam.upper
<built-in method upper of str object at 0x1042e4830>
>>> spam.upper()
'YO I NEED HELP!'
>>> id(spam)
4365109296
स्ट्रिंग रूपांतरण मेमोरी में स्थान को प्रभावित नहीं करता है:
>>> spam = {437 : 'passphrase'}
>>> object.__repr__(spam)
'<dict object at 0x1043313f0>'
>>> str(spam)
"{437: 'passphrase'}"
>>> object.__repr__(spam)
'<dict object at 0x1043313f0>'
हालांकि यह सच है कि id(object)
डिफ़ॉल्ट CPython कार्यान्वयन में वस्तु का पता हो जाता है, यह आम तौर पर बेकार है ... तुम नहीं कर सकते कर शुद्ध अजगर कोड से पता के साथ कुछ भी।
केवल उस समय जब आप वास्तव में पते का उपयोग करने में सक्षम होंगे, एक सी एक्सटेंशन लाइब्रेरी से है ... इस मामले में ऑब्जेक्ट का पता प्राप्त करना तुच्छ है क्योंकि पायथन ऑब्जेक्ट्स को हमेशा सी पॉइंटर्स के रूप में चारों ओर से पारित किया जाता है।
ctypes
मानक लाइब्रेरी में अंतर्निहित टूलकिट का उपयोग नहीं करते हैं । जिस स्थिति में आप पते के साथ सभी प्रकार की चीजें कर सकते हैं :)