दिलचस्प पोस्ट
क्यों जावा 8 विभाजन में कभी-कभी परिणाम स्ट्रिंग की शुरुआत में खाली स्ट्रिंग को हटा दिया जाता है? PHP में कुशल जेपीईजी छवि रीसाइज़िंग वर्तमान फ़ोल्डर का रास्ता ढूंढें – सीएमडी बाश में वाइल्ड कमांड और इसका सामान्य उपयोग कंसोल पर मुद्रण नहीं छपाई अजगर इंडेंटेशन को ठीक कैसे करें .htaccess फ़ाइल के साथ .php फ़ाइल एक्सटेंशन को निकालना एकल निरर्थक तर्क के साथ जावा varargs विधि कॉलिंग? जावा में विंडोज शॉर्टकट (.lnk) पार्सर? क्या मानक C ++ में एक चर प्रकार को प्रिंट करना संभव है? एंड्रॉइड: पृष्ठभूमि छवि का आकार (पिक्सेल में) जो सभी उपकरणों का समर्थन करता है Django: एक टेम्प्लेट में कई टेम्पलेट फ़ॉर्म का उपयोग करते हैं LINQ के साथ वर्ग की संपत्ति द्वारा अलग क्या पर्ल के WWW :: मैकेनाइजेट के एक PHP समकक्ष है? चर === अपरिभाषित बनाम प्रकार के चर === "अपरिभाषित"

आईडी ({}) == आईडी ({}) और आईडी () == आईडी () CPython में क्यों है?

CPython (अन्य पायथन लागूकरण के बारे में कोई सुराग) निम्नलिखित व्यवहार क्यों नहीं करता है?

tuple1 = () tuple2 = () dict1 = {} dict2 = {} list1 = [] list2 = [] # makes sense, tuples are immutable assert(id(tuple1) == id(tuple2)) # also makes sense dicts are mutable assert(id(dict1) != id(dict2)) # lists are mutable too assert(id(list1) != id(list2)) assert(id(()) == id(())) # why no assertion error on this? assert(id({}) == id({})) # or this? assert(id([]) == id([])) 

मेरे पास कुछ विचार हैं, ऐसा क्यों हो सकता है , लेकिन ठोस कारण क्यों नहीं मिल सकता है

संपादित करें

आगे ग्लेन और थॉमस के बिंदु को साबित करने के लिए:

 [1] id([]) 4330909912 [2] x = [] [3] id(x) 4330909912 [4] id([]) 4334243440 

वेब के समाधान से एकत्रित समाधान "आईडी ({}) == आईडी ({}) और आईडी () == आईडी () CPython में क्यों है?"

CPython कचरा इकट्ठा करने वाली वस्तुएं जैसे ही वे गुंजाइश से बाहर जाते हैं, इसलिए पहली [] एकत्रित होने के बाद दूसरा बनाया जाता है। इसलिए, अधिकतर समय यह एक ही मेमोरी स्थान में समाप्त होता है।

यह दिखाता है कि बहुत स्पष्ट रूप से क्या हो रहा है (पायथन के अन्य कार्यान्वयन में आउटपुट अलग होने की संभावना है):

 class A(object): def __init__(self): print "a", def __del__(self): print "b", # aabb False print A() is A() # abab True print id(A()) == id(A()) 

जब आप id({}) , तो पायथन एक डिक्ट बनाता है और id फ़ंक्शन के पास देता है। id फ़ंक्शन अपने आईडी (इसकी स्मृति स्थान) लेता है, और डिक्ट को फेंकता है डिक्ट नष्ट हो गया है जब आप इसे जल्दी उत्तराधिकार में दो बार करते हैं (बिना किसी अन्य समय में बनाए गए अन्य डिकट्स के बिना), डिक्ट पायथन पहली बार स्मृति का एक ही ब्लॉक का उपयोग करने के लिए दूसरी बार बनाता है (CPython के मेमोरी आवंटन की तुलना में यह बहुत अधिक संभावना है)। चूंकि (सीपीआईथॉन में) id मेमोरी स्थान का उपयोग ऑब्जेक्ट आईडी के रूप में होता है, दो ऑब्जेक्ट्स का आईडी समान होता है I यह स्पष्ट रूप से ऐसा नहीं होता है, यदि आप एक वैरिएबल को निर्दिष्ट करते हैं और उसके id() , क्योंकि ये डायग्स एक ही समय में जीवित हैं, इसलिए उनका id अलग होना चाहिए।

परिवर्तनशीलता सीधे खेल में नहीं आती है, लेकिन कोड ऑब्जेक्ट कैप्शिंग ट्यूप्ले और स्ट्रिंग करते हैं। एक ही कोड ऑब्जेक्ट (फ़ंक्शन या क्लास बॉडी या मॉड्यूल बॉडी) में एक ही शाब्दिक (पूर्णांक, स्ट्रिंग और कुछ ट्यूपल्स) का पुन: उपयोग किया जाएगा। उत्परिवर्ती वस्तुओं का पुन: उपयोग कभी नहीं किया जा सकता, वे हमेशा रनटाइम पर बनाए जाते हैं।

संक्षेप में, किसी ऑब्जेक्ट के आईडी केवल ऑब्जेक्ट के जीवनकाल के लिए अद्वितीय है। ऑब्जेक्ट को नष्ट करने के बाद, या इसे बनाने से पहले, कुछ और ही आईडी हो सकता है

यह ज्योथोन में उसी तरह काम नहीं करता …

 >>> id({}) 1 >>> id([]) 2 

क्या एक अनुकूलन हो सकता है जहां आवंटन लागतों को बचाने के लिए आमतौर पर इस्तेमाल किए जाने वाले (यानी खाली) कंटेनरों को "इंटर्न किया गया" हो सकता है?

यह (सीपीआईथॉन में) सुझाव नहीं देता है:

 >>> def mutateid(obj): ... obj.append('x') ... print obj ... print id(obj) ... >>> mutateid([]) ['x'] 4299590472 >>> id([]) 4299590472 >>> 

सूची और डाइक्टर्स पर == ऑपरेटर ऑब्जेक्ट आईडी की तुलना में देखने के लिए नहीं करते हैं कि क्या वे वही ऑब्जेक्ट हैं – obj1 is obj2 उपयोग इसके लिए obj1 is obj2

इसके बजाय == ऑपरेटर, डिक्ट की सूची के सदस्यों की तुलना करके देखता है कि क्या वे समान हैं।