যদি একটি বিবৃতিতে ভেরিয়েবলের আরম্ভ হয় তার সুযোগ কী?


266

আমি পাইথনে নতুন, সুতরাং এটি সম্ভবত একটি সহজ স্কোপিং প্রশ্ন। পাইথন ফাইলের (মডিউল) নীচের কোডগুলি আমাকে কিছুটা বিভ্রান্ত করছে:

if __name__ == '__main__':
    x = 1

print x

যে ভাষাগুলিতে আমি কাজ করেছি সেগুলিতে এই কোডটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে, কারণ xভেরিয়েবলটি ifবিবৃতিতে স্থানীয় এবং এর বাইরে থাকা উচিত নয়। তবে এই কোডটি কার্যকর করে এবং প্রিন্ট করে 1.. কেউ কি এই আচরণটি ব্যাখ্যা করতে পারে? সমস্ত পরিবর্তনশীল একটি মডিউল গ্লোবাল / সম্পূর্ণ মডিউল উপলব্ধ উপলব্ধ?


17
আরেকটি ছল আপনি সচেতন নাও হতে পারে: যদি ifসত্য (অর্থাত, বিবৃতিতে উপরে না রাখা __name__হয় না '__main__' যখন আপনি এটি টপ লেভেল নির্বাহ পরিবর্তে মডিউল আমদানি উদাহরণস্বরূপ,), তারপর xকখনো আবদ্ধ হয়েছে হবে, এবং পরবর্তী print xবিবৃতি একটি নিক্ষেপ করা হবে NameError: name 'x' is not defined
সান্তা

উত্তর:


301

পাইথন ভেরিয়েবলগুলি অন্তর্নিহিত ফাংশন, শ্রেণি বা মডিউলে নির্ধারিত হয় যেখানে তারা নির্ধারিত হয়। ব্লকগুলি পছন্দ করে ifএবং whileব্লকগুলি গণনা করে না, সুতরাং একটি এর ভিতরে নির্ধারিত একটি চলক ifএখনও একটি ফাংশন, শ্রেণি বা মডিউলটিতে স্কোপ করা থাকে।

(অন্তর্নিহিত ফাংশন জেনারেটরের অভিব্যক্তি বা তালিকা / সেট / অভি ধী দ্বারা সংজ্ঞায়িত না গণনা, যেমন ল্যামডা এক্সপ্রেশন না। আপনি ঐ একটিতেও একটি কাজ বিবৃতি সামগ্রী পারবেন না, কিন্তু ল্যামডা পরামিতি এবং forদফা লক্ষ্যমাত্রা অন্তর্নিহিত নিয়োগ হয়।)



105

হ্যাঁ, তারা একই "স্থানীয় স্কোপ" এ আছে এবং আসলে এর মতো কোড পাইথনে প্রচলিত:

if condition:
  x = 'something'
else:
  x = 'something else'

use(x)

নোটটি xশর্তের পূর্বে ঘোষিত বা আরম্ভ করা হয়নি যেমন উদাহরণস্বরূপ এটি সি বা জাভাতে থাকবে।

অন্য কথায়, পাইথনের ব্লক-লেভেল স্কোপ নেই। যেমন উদাহরণস্বরূপ সতর্কতা অবলম্বন করুন

if False:
    x = 3
print(x)

যা স্পষ্টভাবে একটি NameErrorব্যতিক্রম উত্থাপন করবে ।


42

পাইথনের ব্যাপ্তি এই আদেশটি অনুসরণ করে:

  • স্থানীয় সুযোগ অনুসন্ধান করুন

  • যে কোনও বদ্ধ কর্মের সুযোগটি অনুসন্ধান করুন

  • বিশ্বব্যাপী সুযোগ অনুসন্ধান করুন

  • বিল্ট-ইনগুলি অনুসন্ধান করুন

( উত্স )

লক্ষ্য করুন ifএবং অন্যান্য লুপিং / ব্রাঞ্চিং কনস্ট্রাক্টসগুলি তালিকাভুক্ত নয় - কেবল ক্লাস, ফাংশন এবং মডিউলগুলি পাইথনে স্কোপ সরবরাহ করে, তাই কোনও ifব্লকে ঘোষিত যে কোনও কিছুই ব্লকের বাইরে ডিক্লেয়ারড কিছুর মতোই স্কোপ থাকে। সংকলনের সময় চলকগুলি পরীক্ষা করা হয় না, এ কারণেই অন্যান্য ভাষাগুলি একটি ব্যতিক্রম ছুঁড়ে ফেলে। পাইথনে, যতক্ষণ আপনার প্রয়োজনের সময় চলকটি বিদ্যমান থাকে ততক্ষণ কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হবে না।


9

এলি যেমন বলেছিলেন, পাইথনের পরিবর্তনশীল ঘোষণার প্রয়োজন হয় না। সি তে আপনি বলবেন:

int x;
if(something)
    x = 1;
else
    x = 2;

কিন্তু পাইথনের ক্ষেত্রে ঘোষণা অন্তর্নিহিত, সুতরাং আপনি যখন এক্স নিয়োগ করেন এটি স্বয়ংক্রিয়ভাবে ঘোষণা হয়ে যায় declared এটি কারণ পাইথনটি গতিশীলভাবে টাইপ করা হয়েছে - এটি কোনও স্ট্যাটিকালি টাইপ করা ভাষায় কাজ করবে না কারণ ব্যবহৃত পথের উপর নির্ভর করে কোনও পরিবর্তনশীল ঘোষণা না করেই ব্যবহার করা যেতে পারে। স্থিতিশীলভাবে টাইপ করা ভাষায় এটি সংকলনের সময় ধরা পড়বে তবে গতিশীল টাইপ করা ভাষার সাথে এটি অনুমোদিত allowed

ifএই সমস্যাটির কারণে একটি স্ট্যাটিকালি টাইপ করা ভাষা শুধুমাত্র বিবৃতিগুলির বাইরে ভেরিয়েবল ঘোষণা করার মধ্যে সীমাবদ্ধ । গতিশীল আলিঙ্গন!


9

সি এর মতো ভাষার মতো নয়, পাইথন ভেরিয়েবলটি পুরো ফাংশন (বা শ্রেণি বা মডিউল) -এর জন্য যেখানে এটি প্রদর্শিত হয় কেবলমাত্র অন্তঃস্থ "ব্লক" এ নয়। এটি যেমন আপনি int xফাংশনের শীর্ষে ঘোষণা করেছেন (বা শ্রেণি, বা মডিউল), পাইথন ব্যতীত আপনাকে ভেরিয়েবলগুলি ঘোষণা করতে হবে না।

নোট করুন যে চলকটির অস্তিত্ব xকেবল রানটাইম-এ পরীক্ষা করা হয় - এটি যখন আপনি print xবিবৃতিতে পৌঁছান। যদি __name__সমান করা হয়নি "__main__"তারপর আপনি একটি ব্যতিক্রম পেতে হবে: NameError: name 'x' is not defined


শ্রেণিগুলি কোনও সুযোগ তৈরি করে না; ক্লাসে একটি "স্থানীয়" পরিবর্তনশীল কেবল শ্রেণীর নির্দেশে তৈরি হওয়ার পরে যুক্ত হয়।
চিপনার

3

হ্যাঁ. এটা forসুযোগ জন্য সত্য । তবে অবশ্যই ফাংশন নয়।

আপনার উদাহরণে: ifবিবৃতিতে শর্তটি যদি মিথ্যা xহয় তবে তা সংজ্ঞায়িত হবে না।


2

আপনি কমান্ড লাইন থেকে এই কোডটি কার্যকর করছেন তাই ifশর্ত সত্য এবং xসেট করা আছে। তুলনা করা:

>>> if False:
    y = 42


>>> y
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    y
NameError: name 'y' is not defined

0

এবং মনে রাখবেন যে পাইথনের ধরণগুলি কেবল রানটাইমের সময় পরীক্ষা করা হয় আপনার কোড থাকতে পারে:

if True:
    x = 2
    y = 4
else:
    x = "One"
    y = "Two"
print(x + y)

তবে টাইপ সমস্যাগুলির কারণে কোডটি কোনও ত্রুটি ছাড়াই পরিচালিত হবে এমন অন্যান্য উপায়গুলি ভাবতে আমার সমস্যা হচ্ছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.