बदल रहे हैं मेरा मानना है कि सबसे आसान तरीका क्या हो रहा है प्राप्त करने के लिए एक दृश्य प्रतिनिधित्व उपयोग करने के लिए है (इस प्रतिनिधित्व के विचार है मेरा नहीं है, हालांकि मैं इसे प्यार करता)।
सबसे पहले आपको यह समझना होगा कि पाइथन में केवल संदर्भ ऑब्जेक्ट्स के लिए हैं। ऑब्जेक्ट्स स्वयं अलग से एक दूसरे से रहते हैं। उदाहरण के लिए सूची [0, 1]
एक सूची-वस्तु है जिसमें संदर्भ ऑब्जेक्ट 0
और ऑब्जेक्ट 1
पर है। एक संदर्भ किसी प्रकार का लिंक है। यह अन्य भाषाओं में चर से अलग है, क्योंकि वेरिएबल आमतौर पर स्मृति स्थान होते हैं जहां आप चीजें डालते हैं। पायथन में एक "चर", यानी एक पहचानकर्ता, किसी वस्तु के लिए बस "नाम" (= संदर्भ) है।
इसे समझने के लिए, चलो एक रूपक के साथ वस्तुओं के बीच संबंधों को चित्रित करते हैं: मान लें कि वस्तुएं समुद्र में भारी चट्टानें हैं, जो रस्सियों और हुक (¿) द्वारा एक साथ जुड़े हुए हैं। समुद्र की सतह पर पहचानकर्ता जीवित रहते हैं जो वस्तुओं को संदर्भित करता है। पहचानकर्ता बुवाई हैं जो वस्तुओं को गहराई में डूबने से रोकते हैं (जहां, वे कहते हैं, समुद्र राक्षसों (उर्फ कचरा कलेक्टर) उन्हें नष्ट कर देगा)।
a = [0, 1]
निम्न आरेख के साथ
:
उदाहरण के लिए, हम इस स्थिति का प्रतिनिधित्व कर सकते
___
( )
~~~~~~~~(a)~~~~~~~~
(___)
o ¿ o
| O
| o
|
|
+------+-------+
| [ ¿ , ¿ ] |
+----|-----|---+
| |
| |
o | |
O | |
| |
+-+-+ +-+-+
| 0 | | 1 |
+---+ +---+
o O o
)
() o
))() ((
(()(( ())
आप देख सकते हैं पहचानकर्ता a
संदर्भित करता है, यानी एक रस्सी के साथ जुड़ा हुआ है, सूची वस्तु के लिए। सूची-ऑब्जेक्ट में दो स्लॉट हैं, प्रत्येक में 0
और 1
से जुड़े लिंक शामिल हैं।
अब, अगर हम किया था:
b = a
पहचानकर्ता b
एक ही वस्तु a
की को उल्लेख करता है:
___ ___
( ) ( )
~~~~~~~~~~~(a)~~~~~~~~~~~~~~~(b)~~~~~~~~~~~~~~~~
(___) (___)
¿ ¿
\ /
o \ / o
o \ / o
-------+-------
O | [ ¿ , ¿ ] | O
----|-----|----
| |
+-+-+ +-+-+
o | 0 | | 1 |
+---+ +---+ o
O
o O
o
)
) ( ) (
(( )( (( )
()) () ( ()) ()
आप, बजाय, के एक उथले प्रतिलिपि करते हैं a
, के माध्यम से:
b = a[:]
एक नई सूची बनाई गई है, और उसके तत्वों प्रतियां संदर्भ वस्तुओं a
से जाना जाता के हैं, यानी आप रस्सियों की प्रतियां बनाया है, लेकिन वे एक ही तत्व को इंगित:
___ ___
( ) ( )
~~~~~~~~~~~(a)~~~~~~~~~~~~~~~(b)~~~~~~~~~~~~~~~~
(___) (___)
O ¿ ¿ o
| |
o | |
| |
-------+------ ------+-------
| [ ¿ , ¿ ] | | [ ¿ , ¿ ] |
----|----|---- ----|----|----
| | | |
\ \ //
\ \ //
\ \ // o
o \ \ // o
\ \ // o
o \ \ //
\ \// o
O \ X /
\/\/
\/ \/
| |
| |
| |
+-+-+ +-+-+
| 0 | | 1 |
+---+ +---+
)
( ( ) (
)( ) ) ) (( ) ) )
() () ( ( ( ()) () ( ( (
चूंकि पूर्णांक अपरिवर्तनीय हैं, इसलिए प्रतियों या समान समान वस्तुओं का उपयोग करने के बीच कोई अंतर नहीं है, लेकिन जब आप list
एस के साथ पूर्णांक को प्रतिस्थापित करते हैं, जो उत्परिवर्तनीय हैं, तो आप उसी ऑब्जेक्ट को संदर्भ संशोधित करते हैं, इसलिए व्यवहार आप देखते हैं।
दिखने में, कोड:
___ ___
( ) ( )
~~~~~~~~~~~(a)~~~~~~~~~~~~~~~(b)~~~~~~~~~~~~~~~~
(___) (___)
O ¿ ¿ o
| |
o | |
| |
-------+------ ------+-------
| [ ¿ , ¿ ] | | [ ¿ , ¿ ] |
----|----|---- ----|----|----
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
| \/ |
| X |
| /\ |
| / \ |
| / \ |
| / \ |
| / \ |
| / \ |
| | \ |
| | | |
+----+-----+----+ +-----+----+----+
| [ ¿ , ¿ ] | | [ ¿ , ¿ ] |
+----|-----|----+ +----|-----|----+
\ \ / /
\ \ / /
\ \ / /
\ \ / /
\ \ / /
\ |/ /
| |/ /
| X /
| /| /
|/|/
\/ \/
Y Y
| |
+-+-+ +-+-+
| 0 | | 1 |
+---+ +---+
)
( ( ) (
)( ) ) ) (( ) ) )
() () ( ( ( ()) () ( ( (
नोट कैसे सूची b
a
का एक ही उप-सूचियों को संदर्भित करता है: में
a = [[0, 1], [0, 1]]
b = a[:]
परिणाम। (कार्यान्वयन विस्तार: सीपीथॉन का बाइटकोड संकलक शाब्दिक अभिव्यक्तियों को अनुकूलित करेगा, ताकि एक ही 0
और 1
ऑब्जेक्ट्स दोनों उपन्यासियों में उपयोग किए जाएं। छोटे पूर्णांक के लिए कुछ कैशिंग भी शामिल है, लेकिन यह महत्वपूर्ण नहीं है। सामान्य मामले में उपन्यास सभी तत्वों में आम नहीं है)।
एक गहरी प्रति एक प्रति है जो समान वस्तुओं के इस साझाकरण से बचाती है।
उदाहरण के लिए, को क्रियान्वित करने के बाद:
import copy
a = [[0, 1], [0, 1]]
b = copy.deepcopy(a)
स्थिति है:
___ ___
( ) ( )
~~~~~~~~~~~(a)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(b)~~~~~~~~~~~~~~~~
(___) (___)
O ¿ ¿ o
| |
o | |
| |
-------+------ -------+------
| [ ¿ , ¿ ] | | [ ¿ , ¿ ] |
----|----|---- ----|----|----
| \ | \
| \ | \
| \ | \
| \ | \
| \ | \
| \ | \
| \ | \
| \ | \
| \ | \
| \ | \
| \ | \
| \ | \
+----+----------+ +--+------------+ +----+----------+ +--+------------+
| [ ¿ , ¿ ] | | [ ¿ , ¿ ] | | [ ¿ , ¿ ] | | [ ¿ , ¿ ] |
+----|-----|----+ +----|-----|----+ +----|-----|----+ +----|-----|----+
\ \ / / \ \ / /
\ \ / / \ \ / /
\ \ / / \ \ / /
\ \ / / \ \ / /
\ \ / / \ \ / /
\ |/ / \ |/ /
| |/ / | |/ /
| X / | X /
| /| / | /| /
|/|/ |/|/
\/ \/ \/ \/
Y Y Y Y
| | | |
+-+-+ +-+-+ +-+-+ +-+-+
| 0 | | 1 | | 0 | | 1 |
+---+ +---+ +---+ +---+
) )
( ( ) ( ( ( ) (
)( ) ) ) (( ) ) ) )( ) ) ) (( ) ) )
() () ( ( ( ()) () ( ( ( () () ( ( ( ()) () ( ( (
(वास्तव में, ऐसा लगता है copy.deepcopy
की तरह बहुत चालाक निर्मित वस्तुओं है कि अपरिवर्तनीय हैं नकल से बचने के लिए है, int
, long
, tuple
अपरिवर्तनीय वस्तुओं इत्यादि इसलिए सभी उपन्यास समान 0
और 1
ऑब्जेक्ट्स साझा करते हैं)
ध्यान दें कि ये चित्र आपको यह समझने में भी मदद कर सकते हैं कि संदर्भ गणना कैसे काम करती है। प्रत्येक रस्सी एक संदर्भ है, और जब तक किसी ऑब्जेक्ट में संदर्भों की एक श्रृंखला नहीं होती है जो एक बॉय (यानी एक पहचानकर्ता) तक जाती है, यह जीवित रहता है। जब किसी वस्तु को सतह के बॉयज़ से जोड़ने के लिए कोई और रस्सी नहीं होती है, तो वस्तुएं डूब जाती हैं, और कचरा कलेक्टर द्वारा नष्ट हो जाती हैं।
संबंधित: इस तरह http://stackoverflow.com/questions/3119901/python-deepcopylist-vs-new-list-old-list –