আপনি আমাকে বলতে পারেন কেন '?\\\?'=='?\\\\?'দেয় True? এটি আমাকে পাগল করে তোলে এবং আমি যুক্তিসঙ্গত উত্তর খুঁজে পাই না ...
>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
আপনি আমাকে বলতে পারেন কেন '?\\\?'=='?\\\\?'দেয় True? এটি আমাকে পাগল করে তোলে এবং আমি যুক্তিসঙ্গত উত্তর খুঁজে পাই না ...
>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
list()এমনকি অন্তর্ভুক্ত করার দরকার নেই :>>> '?\\\?' '?\\\\?'
উত্তর:
মূলত, কারণ পাইথন ব্যাকস্ল্যাশ প্রসেসিংয়ে সামান্য লেন্সিয়েন্ট। Https://docs.python.org/2.0/ref/strings.html থেকে উদ্ধৃতি :
স্ট্যান্ডার্ড সি থেকে পৃথক, সমস্ত অবিশ্রুত এস্কেপ সিকোয়েন্সগুলি স্ট্রিংটিতে অপরিবর্তিত রয়েছে, অর্থাৎ ব্যাকস্ল্যাশটি স্ট্রিংয়ে রেখে গেছে ।
(মূল জোর দেওয়া)
অতএব, অজগর ক্ষেত্রে, এটি তিনটি ব্যাকস্ল্যাশ চারটির সমান নয়, আপনি যখন একটি চরিত্রের সাথে ব্যাকস্ল্যাশ অনুসরণ করেন তখন ?দু'জনে দুটি চরিত্র হিসাবে উপস্থিত হয়, কারণ \?এটি একটি স্বীকৃত পালানোর ক্রম নয়।
'escape''d')। আপনাকে সেখানে অন্য চরিত্রগুলি মনে রাখতে হবে না!
এর কারণ কারণ ব্যাকস্ল্যাশ অক্ষরগুলি অনুসরণ করে অবিলম্বে অক্ষরগুলির জন্য একটি পালানোর চরিত্র হিসাবে কাজ করে, যদি সংমিশ্রণটি কোনও বৈধ অব্যাহতি ক্রমের প্রতিনিধিত্ব করে। ডজন বা তার বেশি পালানোর সিকোয়েন্সগুলি এখানে তালিকাভুক্ত করা হয়েছে । এগুলিতে নিউলাইন \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
আপনার নির্দিষ্ট উদাহরণগুলির জন্য, প্রথম ক্ষেত্রে '?\\\?', প্রথমটি \একটি ব্যাকস্ল্যাশ রেখে দ্বিতীয় ব্যাকস্ল্যাশ থেকে বেরিয়ে যায়, তবে তৃতীয় ব্যাকস্ল্যাশ ব্যাকস্ল্যাশ হিসাবে রয়ে গেছে কারণ \?এটি বৈধ পালানোর ক্রম নয়। ফলস্বরূপ স্ট্রিং হয় ?\\?।
দ্বিতীয় কেসের জন্য '?\\\\?', প্রথম ব্যাকস্ল্যাশ দ্বিতীয়টি পলায়ন করে এবং তৃতীয় ব্যাকস্ল্যাশ চতুর্থ থেকে পলায়ন করে যার ফলস্বরূপ স্ট্রিং হয় ?\\?।
সুতরাং তিনটি ব্যাকস্ল্যাশ চারটি একই:
>>> '?\\\?' == '?\\\\?'
True
আপনি যদি 3 টি ব্যাকস্ল্যাশ দিয়ে একটি স্ট্রিং তৈরি করতে চান তবে আপনি প্রতিটি ব্যাকস্ল্যাশ থেকে রক্ষা পেতে পারেন:
>>> '?\\\\\\?'
'?\\\\\\?'
>>> print('?\\\\\\?')
?\\\?
অথবা আপনি "কাঁচা" স্ট্রিংগুলি আরও বোধগম্য হতে পারেন:
>>> r'?\\\?'
'?\\\\\\?'
>>> print(r'?\\\?')
?\\\?
আক্ষরিক স্ট্রিংয়ের জন্য এই পালানোর ক্রম প্রক্রিয়াকরণে পরিণত হয়। আরও তথ্যের জন্য স্ট্রিং লিটারালগুলি দেখুন ।
'?\\\?'=='?\\?'দেয় False, আমি এটা ভুল টাইপ। '?\\\?'=='?\\\\?'প্রশ্নটি ইঙ্গিত হিসাবে এটি হওয়া উচিত , আমি এটি সংশোধন করেছি।
স্ট্রিং লিটারালগুলিতে পাইথন লেজিকাল বিশ্লেষণ পৃষ্ঠাটি থেকে: https://docs.python.org/2/references/lexical_analysis.html
একটি টেবিল রয়েছে যা সমস্ত স্বীকৃত পালানোর ক্রমগুলি তালিকাবদ্ধ করে।
হল একটি পালানোর ক্রম যা === \
? একটি পালানোর ক্রম নয় এবং এটি === \?
সুতরাং '\\\\' '\\' এর পরে '\\' যা '\\' (দু'জন পালিয়ে গেছে \)
এবং '\\\' '\\' এর পরে '\' হয় যা '\\' (একজন পালিয়ে যায় \ এবং একটি কাঁচা \)
এছাড়াও, এটি লক্ষ করা উচিত যে পাইথন স্ট্রিং আক্ষরিক চারপাশে একক এবং ডাবল উদ্ধৃতিগুলির মধ্যে পার্থক্য করে না, অন্য কয়েকটি ভাষার মতো নয়।
সুতরাং 'স্ট্রিং' এবং "স্ট্রিং" অজগরটিতে হুবহু একই জিনিস, তারা পালানোর ক্রমের ব্যাখ্যাগুলিকে প্রভাবিত করে না।
মাওহকের উত্তরটি একে একে অনেকটা কভার করে, আমি কেবল এটি আরও সংক্ষিপ্ত আকারে এবং এই আচরণের চিত্রিত করে এমন ন্যূনতম উদাহরণ সহ পুনরায় পুনঃস্থাপন করতে চাই।
আমার অনুমান করার মতো একটি বিষয় হ'ল এস্কেপ প্রসেসিংটি বাম থেকে ডানে চলে আসে, যাতে \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
\\?