सेट परीक्षण, और जब तक वहाँ नए अजगर रिलीज कर रहे हैं, जिस क्रम में वे करते हैं इस आधार पर अलग-अलग हो सकते हैं फॉर्म पर आप मूल्यों को सेट पर सेट कर सकते हैं, जैसा कि मैं नीचे दिखाऊंगा।
>>> set([y, x, 0])
set([0j, Decimal('0')])
और शाब्दिक को पलटने के लिए एक ही:
>>> {y, x, 0}
set([0])
क्या हो रहा है यह है कि सेट शाब्दिक भार मूल्यों ढेर पर और फिर ढेर मूल्यों नया सेट वस्तु से जुड़ जाते हैं उल्टे क्रम में।
जब तक 0
भरी हुई है पहले, अन्य दो वस्तुओं तो 0
के खिलाफ पहले से ही सेट में जांच की जाती है। पल दो अन्य वस्तुओं में से एक पहले भरी हुई है, समानता परीक्षण विफल रहता है और आप दो वस्तुओं जोड़ा मिलती है:
>>> {y, 0, x}
set([Decimal('0'), 0j])
>>> {x, 0, y}
set([0j, Decimal('0')])
सेट कि शाब्दिक रिवर्स में तत्वों को जोड़ने कि वाक्य रचना का समर्थन पायथन के सभी संस्करणों में एक बग मौजूद है , पाइथन 2.7.12 और 3.5.2 तक सभी तरह से। इसे हाल ही में तय किया गया था, issue 26020 देखें (2.7.13, 3.5.3 और 3.6 का हिस्सा, इनमें से कोई भी अभी तक जारी नहीं किया गया है)। आप 2.7.12 को देखें, तो आप देख सकते हैं कि BUILD_SET
in ceval.c
शीर्ष नीचे से ढेर पढ़ता है:
# oparg is the number of elements to take from the stack to add
for (; --oparg >= 0;) {
w = POP();
if (err == 0)
err = PySet_Add(x, w);
Py_DECREF(w);
}
जबकि बाईटकोड उलटे क्रम में ढेर करने के लिए तत्वों कहते हैं (पहली स्टैक पर 0
धक्का):
>>> from dis import dis
>>> dis(compile('{0, x, y}', '', 'eval'))
2 0 LOAD_CONST 1 (0)
3 LOAD_GLOBAL 0 (x)
6 LOAD_GLOBAL 1 (y)
9 BUILD_SET 3
12 RETURN_VALUE
फिक्स स्टैक से तत्वों को रिवर्स ऑर्डर में पढ़ने के लिए है; Python 2.7.13 version का उपयोग करता PEEK()
बजाय POP()
(और एक STACKADJ()
ढेर से तत्वों बाद में दूर करने के लिए):
for (i = oparg; i > 0; i--) {
w = PEEK(i);
if (err == 0)
err = PySet_Add(x, w);
Py_DECREF(w);
}
STACKADJ(-oparg);
समानता परीक्षण मुद्दा अन्य प्रश्न के रूप में ही मूल कारण है; Decimal()
कक्षा में complex
के साथ कुछ समानताएं समस्याएं हैं, जिन्हें पायथन 3.2 में तय किया गया था (Decimal()
support comparisons to complex
and a few other numeric types it didn't support before बनाकर)।
संबंधित: [Dict/सेट पार्सिंग आदेश संगति] (https://stackoverflow.com/q/34623846/4279) – jfs