2012-11-24 33 views
8
>>>a=[999999,2,3] 
    >>>b=[999999,2,3] 
    >>>print(a[0] is b[0]) 
    False#because it works for numbers -5 through 256 
    >>>a=[1,2,3] 
    >>>b=a[:] 
    >>>print(a[0] is b[0]) 
    True#because it works for numbers -5 through 256 
    >>>a=[999999,2,3] 
    >>>b=a[:] 
    >>>print(a[0] is b[0]) 
    True#why not False ??? 

क्या होता है बी = ए [:] (क्यों संख्या -5 के माध्यम से 256 के लिए काम नहीं करता)?क्या होता है बी = ए [:] पायथन में?

+0

मुझे लगता है कि आप दो विचित्र बातें भ्रमित कर रहे हैं: 1) 'ख = एक [:]' प्रतियां सभी पूर्णांक के संदर्भ, इसलिए 'बी [0]' एक ही int को 'a [0] 'और' a [0] के रूप में इंगित करता है b [0] '' सत्य' देता है। 2) संख्याओं के लिए refs -5 के माध्यम से 256 हर समय रखा जाता है। – Shep

उत्तर

11

-5 के लिए 256 रेंज के साथ क्या करना है following:

वर्तमान कार्यान्वयन -5 और 256 के बीच सभी पूर्णांकों के लिए पूर्णांक ऑब्जेक्ट की श्रृंखला रहता है, जब आप उस श्रेणी में एक int बनाने आप वास्तव में बस मौजूदा वस्तु का संदर्भ वापस प्राप्त करें।

इस प्रदर्शन करने के लिए, नोटिस id(123) कैसे एक ही मूल्य लौटने रहता है, जबकि id(9999) विभिन्न मूल्यों लौट सकते हैं:

In [18]: id(123) 
Out[18]: 9421736 

In [19]: id(123) 
Out[19]: 9421736 

In [20]: id(9999) 
Out[20]: 9708228 

In [21]: id(9999) 
Out[21]: 10706060 

इस कोर्स के वर्तमान क्रियान्वन के शिल्पकृति है। एक अलग पायथन कार्यान्वयन ऐसा नहीं कर सकता है, या एक अलग सीमा का उपयोग कर सकता है।

अपने पिछले उदाहरण के रूप में:

In [14]: a=[999999, 2, 3] 

In [15]: b=a[:] 

In [16]: map(id, a) 
Out[16]: [10908252, 9421180, 9421168] 

In [17]: map(id, b) 
Out[17]: [10908252, 9421180, 9421168] 

आप देख सकते हैं, [:] बस प्रतियां संदर्भ। यह बताता है कि a[i] is b[i]True का मूल्यांकन i के लिए क्यों करता है।

+0

और कारण यह संभव है कि पूर्णांक अपरिवर्तनीय हैं। – kindall

+0

आपके 'आईडी (99 99) 'उदाहरण के लिए, यह और भी भ्रमित हो जाता है: इसे आईपीथॉन के बजाय नियमित पायथन 2.x प्रॉम्प्ट में आज़माएं, और आपको प्रत्येक बार वापस आने वाला वही मान दिखाई देगा (क्योंकि वही पूर्णांक स्लॉट है हर बार पुन: उपयोग किया जा रहा है; आईपीथन में इतिहास का अस्तित्व यह असंभव बनाता है)। –

0
a=[1,2,3] 

b=a बी का एक उपनाम बनाता है। इसका मतलब है, बी में सभी बदलाव एक में देखा जाएगा।

बी = ए [:] का मतलब है कि एक प्रतिलिपि बनाना और इसे बी को असाइन करना है।

1
>>>b=a[:] 

सूची में वस्तुओं की एक उथली प्रति बनाता है और नाम कॉपी करते हैं। नई सूची में निहित सभी आइटमों में मूल सूची में आइटम के समान ऑब्जेक्ट आईडी (विचार पॉइंटर्स) होंगे। यह व्यवहार की उम्मीद है।

1

@NPE's answer को जोड़ना है, यहाँ एक अच्छा उदाहरण दिया गया है:

a = range(-7, 259) 
b = range(-7, 259) 
for x, y in zip(a,b): 
    print x, x is y 

प्रिंट:

-7 False 
-6 False 
-5 True 
-4 True 
... 
255 True 
256 True 
257 False 
258 False 
संबंधित मुद्दे