পাইথনটি একটু অদ্ভুত যে এটি সমস্ত স্কোপের জন্য একটি অভিধানে সবকিছু রাখে। মূল a, b, c mostর্ধ্বতম স্কোপ এবং তাই সেই উচ্চতম অভিধানে রয়েছে। ফাংশনের নিজস্ব অভিধান রয়েছে। আপনি যখন print(a)
এবং print(b)
বিবৃতিগুলিতে পৌঁছান , অভিধানে সেই নামে কিছুই নেই, তাই পাইথন তালিকাটি সন্ধান করে এবং সেগুলি বিশ্বব্যাপী অভিধানে সন্ধান করে।
এখন আমরা পেয়ে c+=1
যা, অবশ্যই, সমান c=c+1
। পাইথন যখন এই লাইনটি স্ক্যান করে, তখন এটি বলে "আহা, সি নামের একটি পরিবর্তনশীল আছে, আমি এটিকে আমার স্থানীয় স্কোপ ডিকশনারিতে রেখে দেব।" তারপরে যখন এটি অ্যাসাইনমেন্টের ডান পাশে সিটির জন্য সিটির জন্য একটি মান সন্ধান করে, এটি এর স্থানীয় ভেরিয়েবল সি নামের সন্ধান করে , যার কোনও মান এখনও নেই, এবং ত্রুটিটি ছুঁড়ে দেয়।
global c
উপরে উল্লিখিত বিবৃতিটি পার্সারকে কেবলমাত্র বলে যে এটি c
বিশ্বব্যাপী সুযোগ থেকে এটি ব্যবহার করে এবং তাই নতুন কোনও প্রয়োজন নেই।
যে কারণটিতে এটি বলছে যে লাইনে এটি নিয়ে একটি সমস্যা রয়েছে তা হ'ল কোড তৈরি করার চেষ্টা করার আগে এটি কার্যকরভাবে নামগুলির সন্ধান করছে এবং তাই কিছুটা অর্থে এখনও মনে হয় না যে এটি এখনও সত্যিই সেই লাইনটি করছে। আমি তর্ক করতে পারি যে এটি একটি ব্যবহারযোগ্যতা বাগ, তবে সাধারণত কোনও সংকলকের বার্তাগুলিকে খুব গুরুত্বের সাথে না নেওয়া শিখাই সাধারণত ভাল অভ্যাস ।
যদি এটি কোনও স্বাচ্ছন্দ্য বোধ করে তবে গুডো কিছু আবিষ্কার করে যে অভিধানগুলি সম্পর্কে ব্যাখ্যা করেছিল এমন কিছু আবিষ্কার করার আগে আমি সম্ভবত এই একই সমস্যাটি খনন এবং পরীক্ষার জন্য একটি দিন ব্যয় করেছি।
আপডেট করুন, মন্তব্য দেখুন:
এটি কোডটি দুবার স্ক্যান করে না, তবে এটি কোডটি দুটি পর্যায়ে স্ক্যান করে, লেক্সিং এবং পার্সিং।
কোডের এই লাইনের পার্স কীভাবে কাজ করে তা বিবেচনা করুন। লেক্সার উত্স পাঠটি পড়েন এবং এটিকে ব্যাকরণের "ক্ষুদ্রতম উপাদান" লেক্সেমিতে বিভক্ত করেন। সুতরাং যখন এটি লাইন হিট
c+=1
এটি এটিকে কিছু ভেঙে দেয়
SYMBOL(c) OPERATOR(+=) DIGIT(1)
পার্সার অবশেষে এটিকে একটি পার্স গাছ হিসাবে তৈরি করতে এবং এটি কার্যকর করতে চায়, তবে এটি একটি কার্যভার হিসাবে এটি করার আগে এটি স্থানীয় অভিধানে সি নামের সন্ধান করে, এটি দেখতে পায় না এবং অভিধানে এটি সন্নিবেশ করায় এটি অবিচ্ছিন্ন হিসাবে একটি সম্পূর্ণ সংকলিত ভাষায়, এটি কেবল প্রতীক টেবিলের মধ্যে গিয়ে পার্সের জন্য অপেক্ষা করবে, তবে এটি যেহেতু দ্বিতীয় পাসের বিলাসিতা করবে না, তাই পরবর্তীকালে জীবনকে আরও সহজ করার জন্য এই লেক্সার কিছুটা অতিরিক্ত কাজ করে। কেবলমাত্র, তারপরে এটি অপারেটরকে দেখবে, বিধিগুলি বলে যে "যদি আপনার অপারেটর থাকে তবে + = বাম দিকটি অবশ্যই শুরু করা উচিত" এবং বলে "ওফ!"
এখানে মূল বিষয়টি হ'ল এটি এখনও লাইনের বিশ্লেষণ শুরু করে নি । এটি প্রকৃত বিশ্লেষণের জন্য প্রস্তুতির সমস্ত ঘটছে, সুতরাং লাইন কাউন্টারটি পরবর্তী লাইনে অগ্রসর হয়নি। সুতরাং এটি যখন ত্রুটিটিকে সংকেত দেয়, তখনও এটি আগের লাইনে এটি মনে করে।
আমি যেমন বলেছি, আপনি তর্ক করতে পারেন এটি একটি ব্যবহারযোগ্যতা বাগ, তবে এটি আসলে একটি মোটামুটি সাধারণ জিনিস। কিছু সংকলক এটি সম্পর্কে আরও সৎ এবং "লাইনে XXX বা এর আশেপাশে ত্রুটি" বলে, তবে এটি একটি হয় না।