कैसे जांचें कि क्या दो चर एक ही वस्तु को संदर्भित करते हैं?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
कैसे जांचें कि क्या दो चर एक ही वस्तु को संदर्भित करते हैं?
x = ['a', 'b', 'c']
y = x # x and y reference the same object
z = ['a', 'b', 'c'] # x and z reference different objects
जवाबों:
इसके लिए यही isहै: यदि x is yरिटर्न और एक ही वस्तु है।Truexy
x is zरिटर्न False। लेकिन अगर x और z को सूचियों (उदाहरण के लिए x, z = 13, 13) के बजाय समान मान असाइन किए जाते हैं तो x is zवापस आ जाता है True। ऐसा क्यों है?
xऔर zबिंदु पर। चूंकि छोटे पूर्णांक फेलियर कॉमन होते हैं (-1 एक एरर वैल्यू के रूप में, 0 किसी भी समय आप वास्तव में कुछ इंडेक्स करते हैं, छोटी संख्या आमतौर पर उचित डिफॉल्ट वैल्यू होती है) पायथन छोटी संख्या (-5 से 256) का प्रचार करके और एक ही पूर्णांक ऑब्जेक्ट का पुन: उपयोग करता है। इस प्रकार आपका उदाहरण केवल इस सीमा में संख्याओं के लिए काम करता है। कुछ बड़ा करने का प्रयास करें, अर्थात 270। अधिक जानकारी देखने के लिए यहाँ
isजाँच करें कि क्या दो नाम एक ही मेमोरी लोकेशन को संदर्भित करते हैं। इसका वस्तु से कोई लेना देना नहीं है। स्ट्रिंग्स जैसी अपरिवर्तनीय वस्तुओं को रखना आसान है जो समान हैं लेकिन एक ही स्थान पर संग्रहीत नहीं हैं, उदाहरण के ''a'*10000 is 'a' * 10000लिए गलत है।
"af" is "af"या () is ()... वे एक ही स्मृति स्थान को क्यों साझा करते हैं?
y is xहो जाएगा True, y is zहो जाएगा False।
जबकि दो सही समाधान x is zऔर id(x) == id(z)पहले से ही पोस्ट किए गए हैं, मैं अजगर के कार्यान्वयन विवरण को इंगित करना चाहता हूं। पायथन पूर्णांक को ऑब्जेक्ट्स के रूप में संग्रहीत करता है, एक अनुकूलन के रूप में यह अपनी शुरुआत (-5 से 256) पर छोटे पूर्णांकों का एक गुच्छा उत्पन्न करता है और इन पूर्वाभासित वस्तुओं के लिए एक छोटे से मूल्य के साथ पूर्णांक धारण करने वाले हर चर को इंगित करता है। और जानकारी
इसका मतलब यह है कि पूर्णांक वस्तुओं के लिए एक ही छोटी संख्या (-5 से 256) की जाँच की जाती है कि क्या दो वस्तुएं समान हैं, जो सही होंगी ( ON C-Pyhon , जहां तक मुझे पता है कि यह एक कार्यान्वयन विवरण है ), जबकि बड़े के लिए यह संख्या केवल तभी सही होती है जब एक वस्तु को दूसरे रूप में आरम्भ किया जाता है।
> i = 13
> j = 13
> i is j
True
> a = 280
> b = 280
> a is b
False
> a = b
> a
280
> a is b
True
आप यह भी पहचानने के लिए आईडी () का उपयोग कर सकते हैं कि प्रत्येक चर नाम किस अनोखी वस्तु को संदर्भित करता है।
In [1]: x1, x2 = 'foo', 'foo'
In [2]: x1 == x2
Out[2]: True
In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)
In [4]: x2 = 'foobar'[0:3]
In [5]: x2
Out[5]: 'foo'
In [6]: x1 == x2
Out[6]: True
In [7]: x1 is x2
Out[7]: False
In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)
मैं वास्तव में एक दृश्य प्रतिक्रिया करना पसंद करता हूं, यही कारण है कि मैं कभी-कभी केवल http://www.pythontutor.com/visualize.html#mode=edit को देखता हूं कि स्मृति कैसे आवंटित की जाती है और क्या संदर्भित है।
इस भयानक gif जोड़ा गया के रूप में इस जवाब visualizing के बारे में है ..
यह docs.python.org से है: "प्रत्येक वस्तु की एक पहचान, एक प्रकार और एक मूल्य है। एक वस्तु की पहचान एक बार बनने के बाद कभी नहीं बदलती है; आप इसे स्मृति में ऑब्जेक्ट के पते के रूप में सोच सकते हैं। '' ऑपरेटर है दो वस्तुओं की पहचान की तुलना करता है; आईडी () फ़ंक्शन अपनी पहचान का प्रतिनिधित्व करने वाला पूर्णांक देता है। "
जाहिरा तौर पर हर बार जब आप मूल्य बदलते हैं तो वस्तु को फिर से पहचान के रूप में इंगित किया जाता है। लाइन x = 3 के बाद लाइन x = 3.14 कोई त्रुटि नहीं देता है और x के लिए अलग पहचान, प्रकार और मान देता है।