क्या आप बता सकते हैं कि क्यों '?\\\?'=='?\\\\?'देता है True? जो मुझे पागल कर रहा है और मुझे इसका उचित उत्तर नहीं मिल रहा है ...
>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
क्या आप बता सकते हैं कि क्यों '?\\\?'=='?\\\\?'देता है True? जो मुझे पागल कर रहा है और मुझे इसका उचित उत्तर नहीं मिल रहा है ...
>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
list()यहां तक कि शामिल करने की आवश्यकता नहीं है :>>> '?\\\?' '?\\\\?'
जवाबों:
मूल रूप से, क्योंकि अजगर बैकस्लैश प्रसंस्करण में थोड़ा उदार है। Https://docs.python.org/2.0/ref/strings.html से उद्धरण :
मानक C के विपरीत, सभी अपरिचित बच क्रम को स्ट्रिंग में अपरिवर्तित छोड़ दिया जाता है, अर्थात, बैकस्लैश को स्ट्रिंग में छोड़ दिया जाता है ।
(मूल में जोर)
इसलिए, अजगर में, यह नहीं है कि तीन बैकस्लैश चार के बराबर हैं, यह है कि जब आप एक चरित्र के साथ बैकस्लैश का पालन करते हैं ?, तो दो एक साथ दो पात्रों के रूप में आते हैं, क्योंकि \?एक मान्यता प्राप्त भागने का क्रम नहीं है।
'escape''d')। आपको अन्य पात्रों को याद रखने की ज़रूरत नहीं है!
इसका कारण यह है कि बैकस्लैश चरित्र के लिए एक भागने चरित्र के रूप में कार्य करता है, इसके तुरंत बाद, यदि संयोजन एक मान्य भागने क्रम का प्रतिनिधित्व करता है। दर्जन या तो पलायन क्रम यहां सूचीबद्ध हैं । वे स्पष्ट शब्दों में शामिल हैं जैसे कि newline \n, क्षैतिज टैब \t, गाड़ी वापसी \rऔर अधिक अस्पष्ट जैसे कि यूनिकोड वर्णों का उपयोग करना \N{...}, जैसे \N{WAVY DASH}कि यूनिकोड वर्ण का प्रतिनिधित्व करता है \u3030। हालांकि प्रमुख बिंदु यह है कि यदि भागने का क्रम ज्ञात नहीं है, तो वर्ण क्रम को स्ट्रिंग में छोड़ दिया गया है।
समस्या का एक हिस्सा यह भी हो सकता है कि पायथन इंटरप्रेटर आउटपुट आपको गुमराह कर रहा है। इसका कारण यह है कि बैकस्लैश प्रदर्शित होने पर बच जाते हैं। हालाँकि, यदि आप उन स्ट्रिंग्स को प्रिंट करते हैं, तो आप देखेंगे कि अतिरिक्त बैकस्लैश गायब हो जाएंगे।
>>> '?\\\?'
'?\\\\?'
>>> print('?\\\?')
?\\?
>>> '?\\\?' == '?\\?' # I don't know why you think this is True???
False
>>> '?\\\?' == r'?\\?' # but if you use a raw string for '?\\?'
True
>>> '?\\\\?' == '?\\\?' # this is the same string... see below
True
आपके विशिष्ट उदाहरणों के लिए, पहले मामले में '?\\\?', पहला \एक बैकस्लैश छोड़ने वाले दूसरे बैकस्लैश से बच जाता है, लेकिन तीसरा बैकस्लैश बैकस्लैश के रूप में बना रहता है क्योंकि \?एक वैध एस्केप सीक्वेंस नहीं है। इसलिए जिसके परिणामस्वरूप स्ट्रिंग है ?\\?।
दूसरे मामले के लिए '?\\\\?', पहला बैकस्लैश दूसरे से बच जाता है, और तीसरा बैकस्लैश चौथे से बच जाता है जिसके परिणामस्वरूप स्ट्रिंग होती है ?\\?।
यही कारण है कि तीन backslashes चार के रूप में ही है:
>>> '?\\\?' == '?\\\\?'
True
यदि आप 3 बैकस्लैश के साथ एक स्ट्रिंग बनाना चाहते हैं, तो आप प्रत्येक बैकस्लैश से बच सकते हैं:
>>> '?\\\\\\?'
'?\\\\\\?'
>>> print('?\\\\\\?')
?\\\?
या आपको "कच्चे" तार अधिक समझ में आ सकते हैं:
>>> r'?\\\?'
'?\\\\\\?'
>>> print(r'?\\\?')
?\\\?
यह स्ट्रिंग शाब्दिक के लिए एस्केप सीक्वेंस प्रोसेसिंग की ओर मुड़ता है। देखें स्ट्रिंग literals अधिक जानकारी के लिए।
'?\\\?'=='?\\?'देता है False, मैं इसे गलत टाइप किया। यही कारण है कि होना चाहिए '?\\\?'=='?\\\\?'के रूप में सवाल यह संकेत करता है, मैं इसे ठीक किया गया है।
स्ट्रिंग शाब्दिक के तहत अजगर लेक्सिकल विश्लेषण पृष्ठ से: https://docs.python.org/2/reference/lexical_analysis.html
एक तालिका है जो सभी मान्यता प्राप्त एस्केप अनुक्रमों को सूचीबद्ध करती है।
\\ एक भागने क्रम है जो === \ है
\? भागने का क्रम नहीं है और क्या === \ _ है?
इसलिए '\\\\' '\\' है, जिसके बाद '\\' है जो '\\' है (दो बच गए)
और '\\\' '\\' है, जिसके बाद '\' भी है जो '\\' (एक बच गया और एक कच्चा) है
यह भी, यह ध्यान दिया जाना चाहिए कि अजगर कुछ अन्य भाषाओं के विपरीत, एक स्ट्रिंग शाब्दिक के आसपास के एकल और दोहरे उद्धरणों के बीच अंतर नहीं करता है।
तो 'स्ट्रिंग' और "स्ट्रिंग" अजगर में सटीक एक ही बात है, वे एस्केप दृश्यों की व्याख्या को प्रभावित नहीं करते हैं।
शावके का उत्तर बहुत अधिक इसे कवर करता है, मैं इसे और अधिक संक्षिप्त रूप में और न्यूनतम उदाहरणों के साथ इसे पुनर्स्थापित करना चाहता हूं जो इस व्यवहार का वर्णन करते हैं।
मुझे लगता है कि जोड़ने के लिए एक बात यह है कि बचने की प्रक्रिया बाएं से दाएं चलती है, ताकि \nपहले बैकलैश का पता लगाता है और फिर भागने के लिए एक चरित्र की तलाश करता है, फिर पाता है nऔर बच निकलता है; \\nपहला बैकलैश पाता है, दूसरा पाता है और उससे बच जाता है, फिर उसे nएक शाब्दिक n के रूप में पाता और देखता है; \?बैकस्लैश पाता है और बचने के लिए एक चार की तलाश करता है, वह पाता है ?जो बच नहीं सकता है, और इसलिए \एक शाब्दिक बैकलैश के रूप में व्यवहार करता है ।
जैसा कि शावके ने उल्लेख किया है, यह महत्वपूर्ण है कि एक स्ट्रिंग प्रदर्शित करते समय इंटरैक्टिव दुभाषिया बैकस्लैश से बच जाता है। मैं इसका कारण अनुमान लगा रहा हूं कि यह सुनिश्चित करना है कि कोड संपादक में दुभाषिया से कॉपी किए गए पाठ स्ट्रिंग मान्य अजगर स्ट्रिंग हैं। हालांकि, इस मामले में सुविधा के लिए यह भत्ता भ्रम का कारण बनता है।
>>> print('\?') # \? is not a valid escape code so backslash is left as-is
\?
>>> print('\\?') # \\ is a valid escape code, resulting in a single backslash
'\?'
>>> '\?' # same as first example except that interactive interpreter escapes the backslash
\\?
>>> '\\?' # same as second example, backslash is again escaped
\\?