तुलना करें यदि दो चर एक ही वस्तु को अजगर में संदर्भित करते हैं


94

कैसे जांचें कि क्या दो चर एक ही वस्तु को संदर्भित करते हैं?

x = ['a', 'b', 'c']
y = x                 # x and y reference the same object
z = ['a', 'b', 'c']   # x and z reference different objects

जवाबों:


133

इसके लिए यही isहै: यदि x is yरिटर्न और एक ही वस्तु है।Truexy


6
उदाहरण में, x is zरिटर्न False। लेकिन अगर x और z को सूचियों (उदाहरण के लिए x, z = 13, 13) के बजाय समान मान असाइन किए जाते हैं तो x is zवापस आ जाता है True। ऐसा क्यों है?
— बिल

12
@ बाइल: यह इस बात का एक गुण है कि अजगर कैसे चींटियों को संभालता है। पायथन पूर्णांक वस्तुओं को आवंटित करता है जो xऔर zबिंदु पर। चूंकि छोटे पूर्णांक फेलियर कॉमन होते हैं (-1 एक एरर वैल्यू के रूप में, 0 किसी भी समय आप वास्तव में कुछ इंडेक्स करते हैं, छोटी संख्या आमतौर पर उचित डिफॉल्ट वैल्यू होती है) पायथन छोटी संख्या (-5 से 256) का प्रचार करके और एक ही पूर्णांक ऑब्जेक्ट का पुन: उपयोग करता है। इस प्रकार आपका उदाहरण केवल इस सीमा में संख्याओं के लिए काम करता है। कुछ बड़ा करने का प्रयास करें, अर्थात 270। अधिक जानकारी देखने के लिए यहाँ
— टेड

1
@AndresR नहीं यह गलत है। isजाँच करें कि क्या दो नाम एक ही मेमोरी लोकेशन को संदर्भित करते हैं। इसका वस्तु से कोई लेना देना नहीं है। स्ट्रिंग्स जैसी अपरिवर्तनीय वस्तुओं को रखना आसान है जो समान हैं लेकिन एक ही स्थान पर संग्रहीत नहीं हैं, उदाहरण के ''a'*10000 is 'a' * 10000लिए गलत है।
— जोहान रिट्जेल

1
@JochenRitzel आप पूरी तरह से सही हैं, इस टिप्पणी के लिए धन्यवाद! तो, मुझे नहीं मिलता कि क्या हो रहा है "af" is "af"या () is ()... वे एक ही स्मृति स्थान को क्यों साझा करते हैं?
— एंड्रेसआर

2
@AndreasR कोड में शाब्दिक तार / संख्याओं के लिए संकलक जाँचता है कि वे केवल एक बार मौजूद हैं और उनका पुन: उपयोग करते हैं। विशेष मान जैसे (), कोई नहीं, सही, गलत आदि को एकल भी परिभाषित किया गया है। निष्पादन के दौरान रनटाइम छोटी संख्याओं और तारों का पुन: उपयोग करने की कोशिश करता है, लेकिन अंत में यह गति और स्मृति के बीच एक व्यापार है और क्या खुशी इस बात पर निर्भर करती है कि पायथन रनटाइम कैसे लागू किया गया था।
— जोहान रिट्जेल


11

जबकि दो सही समाधान 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

python3.6: a = 98765; b = 98765; a is b => सत्य है। कुछ स्पष्ट रूप से बदल गया है।
— मिखाइल कलाश्निकोव

@ मिखाइलकालाशनिकोव नोप। मैंने पाइथन 3.6.2 पर परीक्षण किया, यह अभी भी मौजूद है।
— निक्स

अभी भी अजगर 3.7.7
— बिल हुआंग

9

आप यह भी पहचानने के लिए आईडी () का उपयोग कर सकते हैं कि प्रत्येक चर नाम किस अनोखी वस्तु को संदर्भित करता है।

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)

@ आईडी के उपयोग पर टेड का नोट यहां काफी प्रासंगिक है।
— सिंह उफिम्त्सेव

2

मैं वास्तव में एक दृश्य प्रतिक्रिया करना पसंद करता हूं, यही कारण है कि मैं कभी-कभी केवल http://www.pythontutor.com/visualize.html#mode=edit को देखता हूं कि स्मृति कैसे आवंटित की जाती है और क्या संदर्भित है।

यहां छवि विवरण दर्ज करें

इस भयानक gif जोड़ा गया के रूप में इस जवाब visualizing के बारे में है ..


2

यह docs.python.org से है: "प्रत्येक वस्तु की एक पहचान, एक प्रकार और एक मूल्य है। एक वस्तु की पहचान एक बार बनने के बाद कभी नहीं बदलती है; आप इसे स्मृति में ऑब्जेक्ट के पते के रूप में सोच सकते हैं। '' ऑपरेटर है दो वस्तुओं की पहचान की तुलना करता है; आईडी () फ़ंक्शन अपनी पहचान का प्रतिनिधित्व करने वाला पूर्णांक देता है। "

जाहिरा तौर पर हर बार जब आप मूल्य बदलते हैं तो वस्तु को फिर से पहचान के रूप में इंगित किया जाता है। लाइन x = 3 के बाद लाइन x = 3.14 कोई त्रुटि नहीं देता है और x के लिए अलग पहचान, प्रकार और मान देता है।


1
बेहतरीन डॉक कैच।
— प्रोस्टि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.