2010-12-03 14 views
7

सभी:पायथन में किसी ऑब्जेक्ट के संदर्भों की सूची कैसे प्राप्त कर सकता हूं?

a = 1 
b = a 
c = b 

अब मैं टैग किया वस्तु 1 की एक सूची है, जो [a, b, c] है प्राप्त करना चाहते हैं। मैं ये कैसे करूं?

बीटीडब्लू, आधिकारिक तौर पर परिवर्तनीय "ए" को कैसे कॉल करें? मुझे पता है कि यह ऑब्जेक्ट के लिए "ऑब्जेक्ट टैग" है, लेकिन मुझे नहीं पता कि इसकी अवधि क्या है।

धन्यवाद! इस तरह के सी, ए, बी, सी 2 अगर मैं पुन: असाइन कर एक = 2 ​​होना चाहिए के रूप में अन्य भाषा में

a = b = c = 1 
print a, b, c 
1 1 1 
a = 2 
print a, b, c 
2 1 1 

, लेकिन अजगर में, वहाँ की तरह ऐसी कोई बात नहीं है:

कारण है कि मैं इस की क्या ज़रूरत है संदर्भ, इसलिए एबीसी के सभी मूल्यों को बदलने का एकमात्र तरीका एक = बी = सी = 2 है जहां तक ​​मुझे पता है, यही कारण है कि किसी ऑब्जेक्ट के सभी संदर्भ प्राप्त करने का इरादा है।

+0

क्यों? आप यह क्यों चाहते हैं? यह कौन से संभावित उद्देश्यों की सेवा कर सकता है? –

+0

समस्या – user478514

+2

अपडेट की गई अब आप केवल दोहराए गए/क्या/आप चाहते हैं, नहीं/क्यों/आप इसे चाहते हैं। – pillmuncher

उत्तर

2

जो आप पूछ रहे हैं वह बहुत व्यावहारिक नहीं है और संभव नहीं है।

>>> a = 1 
>>> b = a 
>>> c = b 
>>> locals() 
{'a': 1, 'c': 1, 'b': 1, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None} 
>>> [key for key, value in locals().items() if value == 1] 
['a', 'c', 'b'] 
>>> globals() 
{'a': 1, 'c': 1, 'b': 1, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None} 
>>> [key for key, value in globals().items() if value == 1] 
['a', 'c', 'b'] 
+0

धन्यवाद, यह एक दृष्टिकोण है, लेकिन इसका अर्थ अर्थपूर्ण में मेरे लिए कोई साधन नहीं है, मेरा सवाल है कि मैं "चर" को व्यक्त करने की कोशिश करता हूं, बी, सी मान 1 का "रेफरी" है, वे मूल्य के समान संदर्भ हैं 1, लेकिन अगर मैं एक और डी = 1 परिभाषित करता हूं, तो इसमें कोई संदेह नहीं है कि आईडी (डी) आईडी (ए) के समान है, लेकिन यहां मुझे लगता है कि इसका मतलब d.value = a.value का मतलब है लेकिन इसका मतलब नहीं है d = a हालांकि मुझे पता है कि पाइथन में एक ही वस्तु टैग करें। – user478514

+0

@ user478514: यह थोड़ा सा प्रदर्शन कर रहा है कि * यह नहीं किया जा सकता *। –

+0

मेरा मानना ​​है कि यह * किया जा सकता है; नीचे मेरा जवाब देखें। –

2

यह अजगर में एक दिया वस्तु के सभी संदर्भ खोजने के लिए संभव नहीं है: यहाँ यह कर में से एक पागल रास्ता नहीं है। पाइथन में सभी ऑब्जेक्ट्स या सभी संदर्भों को ढूंढना भी संभव नहीं है। (CPython समारोह gc.get_objects करता है, लेकिन यह अजगर कार्यान्वयन भर में पोर्टेबल नहीं है।)

आप dir() या locals() सभी चर कि इस कार्यक्रम में कुछ गुंजाइश पर मौजूद हैं खोजने के लिए उपयोग कर सकते हैं। लेकिन अगर वस्तुओं को अन्य स्थानों में परिभाषित किया गया है, तो आप उन्हें इस विधि से याद कर सकते हैं।

+0

मुझे लगता है कि आपका उत्तर वास्तव में गलत है, क्योंकि 'objgraph' वास्तव में किसी दिए गए ऑब्जेक्ट के संदर्भ ढूंढता है। –

+0

@ErikAllik यह केवल कुछ पायथन कार्यान्वयन में संभव है, क्योंकि यह जीसी की गैर-पोर्टेबल सुविधाओं पर निर्भर करता है। उदाहरण के लिए, यह ज्योथन में काम नहीं करेगा। हालांकि, मैं जवाब में इसका उल्लेख करूंगा। – Heatsink

9

जैसा कि आप देख सकते हैं, उन सभी को ढूंढना असंभव है।

>>> sys.getrefcount(1) 
791 
>>> sys.getrefcount(2) 
267 
>>> sys.getrefcount(3) 
98 
1

सी में सबसे पहले, "=" एक मान असाइनमेंट है और संदर्भ नहीं बनाता है। अधिक विशेष रूप से जब आप एक = बी = 1 लिखते हैं तो यह क्या होता है।

(1) ख = 1 का मूल्यांकन किया जाता है, प्रदान करती है ख के लिए 1 और फिर रिटर्न 1, इसलिए अभिव्यक्ति एक = 1

(2) एक = 1 का मूल्यांकन किया जाता है, प्रदान करती है ख के लिए 1 हो जाता है और उसके बाद 1 रिटर्न जिसका कहीं भी उपयोग नहीं किया जाता है।

फिर एक = 1 केवल अपेक्षित रूप में बदलता है।

पाइथन चीजों में थोड़ा अधिक जटिल होता है क्योंकि प्रत्येक चर एक संदर्भ है, लेकिन यह संख्याओं को अलग-अलग व्यवहार करता है क्योंकि वे अपरिवर्तनीय हैं। संक्षेप में जब आप एक = 1 और बी = 1 लिखते हैं, तो बी बी सही होता है। लेकिन एक बदलना दूसरे को नहीं बदलेगा।

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

7

मैं यहां कुछ गलत जानकारी स्पष्टीकरण देना चाहता हूं। इस तथ्य के साथ वास्तव में कुछ भी नहीं है कि "चींटियां अपरिवर्तनीय हैं"। जब आप a = 2 लिखते हैं तो आप a और a अकेले कुछ अलग-अलग असाइन कर रहे हैं - इसका b और c पर कोई प्रभाव नहीं पड़ता है।

आप फिर भी एक संपत्ति a की संशोधित करने के लिए थे, तो यह होगा प्रभाव b और c हैं। उम्मीद है कि इस उदाहरण बेहतर दिखाता है मैं किस बारे में बात कर रहा हूँ:

>>> a = b = c = [1] # assign everyone to the same object 
>>> a, b, c 
([1], [1], [1]) 
>>> a[0] = 2   # modify a member of a 
>>> a, b, c 
([2], [2], [2])  # everyone gets updated because they all refer to the same object 
>>> a = [3]   # assign a to a new object 
>>> a, b, c 
([3], [2], [2])  # b and c are not affected 
3

मुझे लगता है कि आप objgraph में रुचि हो सकती। यह आपको स्मृति में ऑब्जेक्ट ग्राफ़ को पार करने की अनुमति देता है, या आपके ऑब्जेक्ट ग्राफ़ के PNG को डंप करता है। यह मेमोरी लीक डीबग करने के लिए उपयोगी है। pyjack पर http://mg.pov.lt/objgraph/

0

देखो:

यह पेज देखें। इसकी replace_all_refs फ़ंक्शन किसी ऑब्जेक्ट के सभी संदर्भों को प्रतिस्थापित करने के लिए बहुत अच्छी तरह से काम करता प्रतीत होता है। नोट: स्ट्रिंग ऑब्जेक्ट्स के साथ अच्छी तरह से काम नहीं करता है।

संबंधित मुद्दे

 संबंधित मुद्दे