यह मेरी समझ है कि एक सूची सन्निहित स्मृति स्थानों का एक ब्लॉक है जिसमें स्मृति में तत्व मानों के पॉइंटर्स होते हैं। जैसा कि नीचे दिया गया है:

list in memory

मेरा प्रश्न यह है कि क्या यह स्मृति में वस्तुओं के साथ समान है यानी: मान लीजिए कि मेरे पास एक बिंदु वर्ग है जिसमें एक init विधि निम्नानुसार लागू की गई है:

class Point: 
    def __init__(self, x, y): 
        self.x = x
        self.y = y

और मैं एक नया बिंदु वस्तु बनाता हूं:

p = Point(4,6)

क्या स्मृति में p.x का सूचक और p.y का सूचक एक दूसरे के बगल में होगा?

4
Teererai Marange 7 अक्टूबर 2018, 23:55

2 जवाब

सबसे बढ़िया उत्तर

पायथन - यानी प्रोग्रामिंग भाषा - में मेमोरी लोकेशन या पॉइंटर्स की कोई अवधारणा नहीं है। तो उस दृष्टि से आपके प्रश्न का कोई उत्तर नहीं है। आपके प्रश्न का उत्तर केवल अजगर के विशिष्ट कार्यान्वयन के लिए दिया जा सकता है, जैसे CPython

उस ने कहा, अजगर के हर कार्यान्वयन के लिए उत्तर नहीं होने जा रहा है। ऐसा इसलिए है क्योंकि (अधिकांश) पायथन वर्ग अपनी विशेषताओं को एक शब्दकोश में संग्रहीत करते हैं। हम इस शब्दकोश को __dict__ नाम से एक्सेस कर सकते हैं :

>>> Point(1, 2).__dict__
{'x': 1, 'y': 2}

चूंकि dicts को कुशल होना चाहिए और O(1) लुकअप समय होना चाहिए, इसलिए उन्हें आमतौर पर हैश टेबल। हैश तालिका में x और y एक दूसरे के ठीक बगल में होने की संभावना बहुत कम है।

हालांकि, सभी वर्ग विशेषताओं को संग्रहीत करने के लिए एक शब्दकोश का उपयोग नहीं करते हैं। दो अपवाद हैं:

विशेष __slots__ वर्ग चर हमें अजगर को यह बताने की अनुमति देता है कि कक्षा में कौन सी विशेषताएँ होंगी। पायथन तब इन विशेषताओं को संग्रहीत करने के लिए केवल पर्याप्त मेमोरी आवंटित करेगा, और कोई अन्य विशेषता बनाने की कोशिश करने से त्रुटि होगी:

class Point: 
    __slots__ = ('x', 'y')

    def __init__(self, x, y): 
        self.x = x
        self.y = y
>>> p = Point(1, 2)
>>> p.x
1
>>> p.__dict__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Point' object has no attribute '__dict__'
>>> p.z = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Point' object has no attribute 'z'

यदि कोई वर्ग __slots__ का उपयोग करता है, तो इसकी अधिक संभावना है कि इसकी सभी विशेषताएँ स्मृति में एक दूसरे के बगल में संग्रहीत हैं। लेकिन इसकी अभी भी कोई गारंटी नहीं है। पायथन कार्यान्वयन गुणों को स्टोर कर सकता है हालांकि यह चाहता है।

8
Aran-Fey 7 अक्टूबर 2018, 21:34

सामान्य तौर पर नहीं क्योंकि एक साधारण वस्तु के गुण हैश तालिका में संग्रहीत होते हैं, जो विशेषता नाम से कुंजीबद्ध होते हैं। अन्य कार्यान्वयन संभव हैं (जैसा कि स्वयं और कुछ जावास्क्रिप्ट कार्यान्वयन में), लेकिन मेरी जानकारी के लिए, कोई भी पायथन कार्यान्वयन वर्तमान में ऐसा नहीं करता है।

यदि आपने टुपल्स का उपयोग किया है, जैसे कि collections.namedtuple (कार्यान्वयन काफी शिक्षाप्रद है), तो संकेत आसन्न होंगे।

1
Florian Weimer 7 अक्टूबर 2018, 21:18