कहो की सूची मैं दो सूचियों है:अजगर बुनियादी डेटा संदर्भ, एक ही संदर्भ
>>> l1=[1,2,3,4]
>>> l2=[11,12,13,14]
मैं एक टपल, या शब्दकोश में उन सूचियों रख सकते हैं, और ऐसा लगता है कि वे सभी संदर्भों को मूल सूची में वापस आ रहे हैं :
>>> t=(l1,l2)
>>> d={'l1':l1, 'l2':l2}
>>> id(l1)==id(d['l1'])==id(t[0])
True
>>> l1 is d['l1'] is t[0]
True
क्योंकि वे संदर्भ हैं, मैं l1
बदल सकते हैं और टपल और शब्दकोश तदनुसार परिवर्तन में संदर्भित किया जाता डेटा कर सकते हैं:
>>> l1.append(5)
>>> l1
[1, 2, 3, 4, 5]
>>> t
([1, 2, 3, 4, 5], [11, 12, 13, 14])
>>> d
{'l2': [11, 12, 13, 14], 'l1': [1, 2, 3, 4, 5]}
सहित अगर मैं टपल t
में शब्दकोश d
या परिवर्तनशील संदर्भ में संदर्भ संलग्न:
>>> d['l1'].append(6)
>>> t[0].append(7)
>>> d
{'l2': [11, 12, 13, 14], 'l1': [1, 2, 3, 4, 5, 6, 7]}
>>> l1
[1, 2, 3, 4, 5, 6, 7]
अब मैं एक नई सूची में l1
सेट करते हैं, मूल सूची के लिए संदर्भ गिनती कम हो जाती है:
>>> sys.getrefcount(l1)
4
>>> sys.getrefcount(t[0])
4
>>> l1=['new','list']
>>> l1 is d['l1'] is t[0]
False
>>> sys.getrefcount(l1)
2
>>> sys.getrefcount(t[0])
3
और l1
को जोड़ना या बदलना d['l1']
या t[0]
नहीं बदलता है क्योंकि यह अब एक नया संदर्भ है। पाइथन दस्तावेजों में अप्रत्यक्ष संदर्भों की धारणा covered fairly well है लेकिन पूरी तरह से नहीं।
मेरे सवालों का:
एक परिवर्तनशील वस्तु हमेशा एक संदर्भ है? क्या आप हमेशा मानते हैं कि इसे संशोधित करने से मूल को संशोधित किया जाता है (जब तक आप विशेष रूप से
l2=l1[:]
प्रकार की मूर्खता के साथ प्रतिलिपि बनाते हैं)?क्या मैं पाइथन में सभी संदर्भों की एक सूची एकत्र कर सकता हूं? यानी, कुछ फ़ंक्शन
f(l1)
जो['l1', 'd', 't']
लौटाता है यदि वे सभी एक ही सूची का जिक्र कर रहे हैं?यह मेरी धारणा है कि इससे कोई फर्क नहीं पड़ता कि डेटा तब तक वैध रहेगा जब तक इसका कुछ संदर्भ न हो।
अर्थात्:
l=[1,2,3] # create an object of three integers and create a ref to it
l2=l # create a reference to the same object
l=[4,5,6] # create a new object of 3 ints; the original now referenced
# by l2 is unchanged and unmoved
3 के लिए प्रासंगिक: http://docs.python.org/library/weakref.html –