প্রথম ব্যবহারের পরে পুনর্নির্দিষ্ট করা হলে স্থানীয় পরিবর্তনশীলগুলিতে আনবাউন্ডলোক্যালআরআরআর


208

নিম্নলিখিত কোডটি পাইথন 2.5 এবং 3.0 উভয় ক্ষেত্রে প্রত্যাশার মতো কাজ করে:

a, b, c = (1, 2, 3)

print(a, b, c)

def test():
    print(a)
    print(b)
    print(c)    # (A)
    #c+=1       # (B)
test()

যাইহোক, আমি যখন লাইন (বি )টিকে অসন্তুষ্ট করি তখন আমি একটি UnboundLocalError: 'c' not assignedলাইন (এ) পাই । মান aএবং bসঠিকভাবে ছাপা হয়। এটি আমাকে দুটি কারণে পুরোপুরি বিচলিত করেছে:

  1. কেন একটি রানটাইম এরর লাইনে ফেলা হয় (একটি) লাইনে পরবর্তী বিবৃতির কারণ (বি) ?

  2. কেন ভেরিয়েবল aএবং bপ্রত্যাশিত হিসাবে মুদ্রিত হয়, যখন cএকটি ত্রুটি উত্থাপন করে?

কেবলমাত্র আমি যে ব্যাখ্যাটি সামনে আসতে পারি তা হ'ল একটি স্থানীয় ভেরিয়েবল cঅ্যাসাইনমেন্ট দ্বারা তৈরি করা হয় c+=1, যা cস্থানীয় বৈকল্পিক তৈরি হওয়ার আগেই "গ্লোবাল" ভেরিয়েবলের চেয়ে নজির গ্রহণ করে । অবশ্যই, কোনও ভেরিয়েবলের উপস্থিতি হওয়ার আগে এটি "চুরি" করার সুযোগটি বোঝায় না।

কেউ দয়া করে এই আচরণটি ব্যাখ্যা করতে পারেন?

উত্তর:


216

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

আপনি যদি ভেরিয়েবলটি ফাংশনের আগে নির্ধারিত cগ্লোবালটি উল্লেখ করতে চান তবে c = 3রাখুন

global c

ফাংশন প্রথম লাইন হিসাবে।

অজগর 3 হিসাবে, এখন আছে

nonlocal c

যা আপনি cভেরিয়েবলের নিকটতম এনক্লোজিং ফাংশন স্কোপটি উল্লেখ করতে ব্যবহার করতে পারেন ।


3
ধন্যবাদ। দ্রুত প্রশ্ন. এর দ্বারা কি বোঝানো হয় যে একটি প্রোগ্রাম চালানোর আগে পাইথন প্রতিটি ভেরিয়েবলের ক্ষেত্রটি স্থির করে? কোন ফাংশন চালানোর আগে?
tba

7
পরিবর্তনশীল সুযোগের সিদ্ধান্তটি সংকলক তৈরি করে, যা আপনি যখন প্রথম প্রোগ্রামটি শুরু করেন তখন সাধারণত চলে। তবে এটি মনে রাখা উচিত যে আপনার প্রোগ্রামটিতে "ইওল" বা "এক্সিকিউটিভ" বিবৃতি থাকলে সংকলকটি পরেও চলতে পারে।
গ্রেগ হিউগিল

2
ঠিক আছে ধন্যবাদ. আমি অনুমান করি "ব্যাখ্যা করা ভাষা" তেমন বোঝায় না যতটা আমি ভেবেছিলাম।
tba

1
আহ যে 'ননলোকাল' কীওয়ার্ডটি হুবহু আমি খুঁজছিলাম, মনে হয়েছিল পাইথন এটি হারিয়েছে। সম্ভবত এই প্রতিবন্ধকতার সুযোগের মাধ্যমে এই 'ক্যাসকেডস' যা এই কীওয়ার্ডটি ব্যবহার করে ভেরিয়েবলটি আমদানি করে?
ব্রেন্ডন

6
@ ব্রেনফস্যাক: আপনি যদি "সন্ধান করা" এবং "নির্ধারিত" কোনও ভেরিয়েবলের মধ্যে পার্থক্য তৈরি করেন তবে তা বোঝা সহজ। বর্তমান সুযোগে নামটি খুঁজে পাওয়া না গেলে লুকআপ আবার উচ্চতর স্কোপে ফিরে যায়। অ্যাসাইনমেন্ট সর্বদা স্থানীয় স্কোপগুলিতে করা হয় (আপনি যদি না ব্যবহার করেন globalবা nonlocalগ্লোবাল বা ননালোকাল এসাইনমেন্ট জোর করে না করেন)
স্টিভেন

71

পাইথনটি একটু অদ্ভুত যে এটি সমস্ত স্কোপের জন্য একটি অভিধানে সবকিছু রাখে। মূল a, b, c mostর্ধ্বতম স্কোপ এবং তাই সেই উচ্চতম অভিধানে রয়েছে। ফাংশনের নিজস্ব অভিধান রয়েছে। আপনি যখন print(a)এবং print(b)বিবৃতিগুলিতে পৌঁছান , অভিধানে সেই নামে কিছুই নেই, তাই পাইথন তালিকাটি সন্ধান করে এবং সেগুলি বিশ্বব্যাপী অভিধানে সন্ধান করে।

এখন আমরা পেয়ে c+=1যা, অবশ্যই, সমান c=c+1। পাইথন যখন এই লাইনটি স্ক্যান করে, তখন এটি বলে "আহা, সি নামের একটি পরিবর্তনশীল আছে, আমি এটিকে আমার স্থানীয় স্কোপ ডিকশনারিতে রেখে দেব।" তারপরে যখন এটি অ্যাসাইনমেন্টের ডান পাশে সিটির জন্য সিটির জন্য একটি মান সন্ধান করে, এটি এর স্থানীয় ভেরিয়েবল সি নামের সন্ধান করে , যার কোনও মান এখনও নেই, এবং ত্রুটিটি ছুঁড়ে দেয়।

global cউপরে উল্লিখিত বিবৃতিটি পার্সারকে কেবলমাত্র বলে যে এটি cবিশ্বব্যাপী সুযোগ থেকে এটি ব্যবহার করে এবং তাই নতুন কোনও প্রয়োজন নেই।

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

যদি এটি কোনও স্বাচ্ছন্দ্য বোধ করে তবে গুডো কিছু আবিষ্কার করে যে অভিধানগুলি সম্পর্কে ব্যাখ্যা করেছিল এমন কিছু আবিষ্কার করার আগে আমি সম্ভবত এই একই সমস্যাটি খনন এবং পরীক্ষার জন্য একটি দিন ব্যয় করেছি।

আপডেট করুন, মন্তব্য দেখুন:

এটি কোডটি দুবার স্ক্যান করে না, তবে এটি কোডটি দুটি পর্যায়ে স্ক্যান করে, লেক্সিং এবং পার্সিং।

কোডের এই লাইনের পার্স কীভাবে কাজ করে তা বিবেচনা করুন। লেক্সার উত্স পাঠটি পড়েন এবং এটিকে ব্যাকরণের "ক্ষুদ্রতম উপাদান" লেক্সেমিতে বিভক্ত করেন। সুতরাং যখন এটি লাইন হিট

c+=1

এটি এটিকে কিছু ভেঙে দেয়

SYMBOL(c) OPERATOR(+=) DIGIT(1)

পার্সার অবশেষে এটিকে একটি পার্স গাছ হিসাবে তৈরি করতে এবং এটি কার্যকর করতে চায়, তবে এটি একটি কার্যভার হিসাবে এটি করার আগে এটি স্থানীয় অভিধানে সি নামের সন্ধান করে, এটি দেখতে পায় না এবং অভিধানে এটি সন্নিবেশ করায় এটি অবিচ্ছিন্ন হিসাবে একটি সম্পূর্ণ সংকলিত ভাষায়, এটি কেবল প্রতীক টেবিলের মধ্যে গিয়ে পার্সের জন্য অপেক্ষা করবে, তবে এটি যেহেতু দ্বিতীয় পাসের বিলাসিতা করবে না, তাই পরবর্তীকালে জীবনকে আরও সহজ করার জন্য এই লেক্সার কিছুটা অতিরিক্ত কাজ করে। কেবলমাত্র, তারপরে এটি অপারেটরকে দেখবে, বিধিগুলি বলে যে "যদি আপনার অপারেটর থাকে তবে + = বাম দিকটি অবশ্যই শুরু করা উচিত" এবং বলে "ওফ!"

এখানে মূল বিষয়টি হ'ল এটি এখনও লাইনের বিশ্লেষণ শুরু করে নি । এটি প্রকৃত বিশ্লেষণের জন্য প্রস্তুতির সমস্ত ঘটছে, সুতরাং লাইন কাউন্টারটি পরবর্তী লাইনে অগ্রসর হয়নি। সুতরাং এটি যখন ত্রুটিটিকে সংকেত দেয়, তখনও এটি আগের লাইনে এটি মনে করে।

আমি যেমন বলেছি, আপনি তর্ক করতে পারেন এটি একটি ব্যবহারযোগ্যতা বাগ, তবে এটি আসলে একটি মোটামুটি সাধারণ জিনিস। কিছু সংকলক এটি সম্পর্কে আরও সৎ এবং "লাইনে XXX বা এর আশেপাশে ত্রুটি" বলে, তবে এটি একটি হয় না।


1
ঠিক আছে আপনার প্রতিক্রিয়া জন্য আপনাকে ধন্যবাদ; পাইথনের স্কোপগুলি সম্পর্কে এটি আমার কাছে কিছু জিনিস পরিষ্কার করেছে। তবে, তবুও কেন ত্রুটিটি লাইন (বি) এর পরিবর্তে লাইনে (এ) উত্থিত হয়েছে তা আমি এখনও বুঝতে পারি না। প্রোগ্রামটি চালানোর আগে পাইথন কি তার ভেরিয়েবল স্কোপ ডিকশনারি তৈরি করে?
tba

1
না, এটি প্রকাশের স্তরে। আমি উত্তরে যুক্ত করব, আমি কোনও মন্তব্যে এটি ফিট করতে পারি বলে মনে করি না।
চার্লি মার্টিন

2
প্রয়োগের বিশদসমূহের নোট: সিপাইটিতে স্থানীয় ক্ষেত্রটি সাধারণত একটি হিসাবে পরিচালিত হয় না dict, এটি অভ্যন্তরীণভাবে কেবলমাত্র একটি অ্যারে ( ফিরে আসার জন্য locals()একটি তৈরি করবে dict, তবে এতে পরিবর্তনগুলি নতুন তৈরি করে না locals)। পার্স ফেজটি প্রতিটি অ্যাসাইনমেন্ট একটি স্থানীয়কে সন্ধান করে এবং সেই অ্যারেতে নাম থেকে অন্য অবস্থানে রূপান্তর করে এবং যখনই নামটি রেফারেন্স করা হয় সেই অবস্থানটি ব্যবহার করে। ফাংশনে প্রবেশের সময়, অ-তর্ক স্থানীয় লোকেরা কোনও স্থানধারককে সূচনা করা হয় এবং UnboundLocalErrorভেরিয়েবলটি পড়ার সাথে সাথে ঘটে থাকে এবং এর সাথে সম্পর্কিত সূচকটিতে এখনও স্থানধারকের মান থাকে।
শ্যাডোর্যাঞ্জার

44

বিচ্ছিন্নতা দেখে একবারে স্পষ্ট হয়ে উঠতে পারে যে:

>>> def f():
...    print a
...    print b
...    a = 1

>>> import dis
>>> dis.dis(f)

  2           0 LOAD_FAST                0 (a)
              3 PRINT_ITEM
              4 PRINT_NEWLINE

  3           5 LOAD_GLOBAL              0 (b)
              8 PRINT_ITEM
              9 PRINT_NEWLINE

  4          10 LOAD_CONST               1 (1)
             13 STORE_FAST               0 (a)
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE

যেমন আপনি দেখতে পাচ্ছেন, একটিতে অ্যাক্সেস করার জন্য বাইটকোড LOAD_FASTএবং খ, এর জন্য LOAD_GLOBAL। এটি কারণ কারণ সংকলকটি চিহ্নিত করেছে যে একটি ফাংশনের মধ্যে নির্ধারিত হয়েছে এবং এটি স্থানীয় ভেরিয়েবল হিসাবে শ্রেণিবদ্ধ করেছে। স্থানীয়দের অ্যাক্সেস মেকানিজম গ্লোবালগুলির জন্য মৌলিকভাবে পৃথক - এগুলি ফ্রেমের ভেরিয়েবল সারণিতে স্ট্যাটিকালি একটি অফসেট বরাদ্দ করা হয়, যার অর্থ গ্লোবালগুলির তুলনায় আরও ব্যয়বহুল ডিক দেখার চেয়ে লুকিং একটি দ্রুত সূচক। এ কারণে পাইথন print a"স্লট 0-এ থাকা স্থানীয় ভেরিয়েবলের মান 'এবং এটি মুদ্রণ করুন" হিসাবে লাইনটি পড়ছে এবং যখন এটি সনাক্ত করে যে এই চলকটি এখনও অনির্বাচিত রয়েছে, তখন একটি ব্যতিক্রম উত্থাপন করে।


10

আপনি যখন traditionalতিহ্যগত বৈশ্বিক পরিবর্তনশীল শব্দার্থক চেষ্টা করেন তখন পাইথনের বরং আকর্ষণীয় আচরণ থাকে। আমি বিশদটি মনে রাখছি না তবে আপনি 'গ্লোবাল' স্কোপে ঘোষিত একটি পরিবর্তকের মান পড়তে পারেন তবে আপনি যদি এটি পরিবর্তন করতে চান তবে আপনাকে globalকীওয়ার্ডটি ব্যবহার করতে হবে । এটিতে পরিবর্তন test()করার চেষ্টা করুন :

def test():
    global c
    print(a)
    print(b)
    print(c)    # (A)
    c+=1        # (B)

এছাড়াও, আপনি এই ত্রুটিটি পাবার কারণ হ'ল কারণ আপনি সেই ফাংশনের অভ্যন্তরে একটি 'বৈশ্বিক' নাম হিসাবে একই নামের সাথে একটি নতুন ভেরিয়েবল ঘোষণা করতে পারেন এবং এটি সম্পূর্ণ পৃথক হবে। দোভাষী অনুবাদক মনে করেন আপনি এই স্কোপটিতে একটি নতুন পরিবর্তনশীল বানানোর চেষ্টা করছেন cএবং এটি সমস্তই একটি অপারেশনে সংশোধন করতে চাইছেন , যা পাইথনে অনুমোদিত নয় কারণ এই নতুনটি cআরম্ভ করা হয়নি।


আপনার প্রতিক্রিয়াটির জন্য ধন্যবাদ, তবে আমি মনে করি না কেন এটি ত্রুটিটি লাইনে (এ) নিক্ষেপ করা হয়েছে যেখানে আমি কেবল একটি পরিবর্তনশীল মুদ্রণের চেষ্টা করছি। প্রোগ্রামটি কখনই লাইনে (বি) যায় না যেখানে এটি একটি অ-আরম্ভীকৃত ভেরিয়েবলটি সংশোধন করার চেষ্টা করছে।
tba

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

6

এটি পরিষ্কার করে দেওয়ার সর্বোত্তম উদাহরণটি হ'ল:

bar = 42
def foo():
    print bar
    if False:
        bar = 0

কল করার সময় foo()এটি উত্থাপিত হয় UnboundLocalError যদিও আমরা কখনও লাইনে পৌঁছাতে পারি না bar=0, সুতরাং যৌক্তিকভাবে স্থানীয় পরিবর্তনশীল কখনই তৈরি করা উচিত নয়।

রহস্যটি " পাইথন একটি ইন্টারপ্রেটেড ল্যাঙ্গুয়েজ " এর মধ্যে রয়েছে এবং ফাংশনটির ঘোষণাকে fooএকক বিবৃতি (অর্থাত্‍ একটি যৌগিক বিবৃতি) হিসাবে ব্যাখ্যা করা হয়, এটি কেবল নির্বোধভাবে ব্যাখ্যা করে এবং স্থানীয় এবং বৈশ্বিক স্কোপ তৈরি করে। তাই barমৃত্যুদন্ড কার্যকর করার আগে স্থানীয় সুযোগে স্বীকৃত।

এর মতো আরও উদাহরণের জন্য এই পোস্টটি পড়ুন: http://blog.amir.rachum.com/blog/2013/07/09/python-common-newbie-mistkes-part-2/

এই পোস্টটি ভেরিয়েবলের পাইথন স্কোপিংয়ের একটি সম্পূর্ণ বিবরণ এবং বিশ্লেষণ সরবরাহ করে:


5

এখানে দুটি লিঙ্ক সহায়তা করতে পারে

1: ডকস.পিথন.আর.৩.৩.১ / ফাখ / প্রোগ্রামিং এইচটিএমএল? হাইটলাইট

2: ডকস.পিথন.আর.৩.৩.১ / ফাখ / প্রোগ্রামিং.ইচটিএমএল? হাইটলাইট=নলোকাল

লিঙ্ক এক ত্রুটি আনবাউন্ডলোক্যালআরারের বর্ণনা করে। লিঙ্ক টু আপনার পরীক্ষা ফাংশনটি পুনরায় লেখার ক্ষেত্রে সহায়তা করতে পারে। লিঙ্ক টুয়ের উপর ভিত্তি করে, আসল সমস্যাটি এ হিসাবে আবারও লেখা যেতে পারে:

>>> a, b, c = (1, 2, 3)
>>> print (a, b, c)
(1, 2, 3)
>>> def test (a, b, c):
...     print (a)
...     print (b)
...     print (c)
...     c += 1
...     return a, b, c
...
>>> a, b, c = test (a, b, c)
1
2
3
>>> print (a, b ,c)
(1, 2, 4)

4

এটি আপনার প্রশ্নের সরাসরি উত্তর নয়, তবে এটি ঘনিষ্ঠভাবে সম্পর্কিত, কারণ এটি বর্ধিত অ্যাসাইনমেন্ট এবং ফাংশন স্কোপের মধ্যে সম্পর্কের ফলে ঘটে যাওয়া আরও একটি গোটা।

বেশিরভাগ ক্ষেত্রে, আপনি বর্ধিত অ্যাসাইনমেন্ট ( a += b)টিকে সাধারণ অ্যাসাইনমেন্ট ( a = a + b) এর ঠিক সমান হিসাবে ভাবেন । এটি একটি কোণার ক্ষেত্রে, যদিও এটি দিয়ে কিছুটা সমস্যায় পড়তে পাওয়া সম্ভব। আমাকে ব্যাখ্যা করতে দাও:

পাইথনের সরল অ্যাসাইনমেন্টটি যেভাবে কাজ করে তার অর্থ হ'ল যদি aকোনও ফাংশনে পাস করা হয় (যেমন func(a); দ্রষ্টব্য যে পাইথন সর্বদা পাস-বাই-রেফারেন্স থাকে) তবে a = a + bতার পরে aপাস করা সংশোধন করা হবে না Instead পরিবর্তে, এটি কেবলমাত্র স্থানীয় পয়েন্টারটিতে পরিবর্তিত হবে a

তবে আপনি যদি ব্যবহার করেন a += bতবে এটি কখনও কখনও প্রয়োগ করা হয়:

a = a + b

বা কখনও কখনও (যদি পদ্ধতিটি বিদ্যমান থাকে) যেমন:

a.__iadd__(b)

প্রথম ক্ষেত্রে (যতক্ষণ aনা গ্লোবাল হিসাবে ঘোষিত হয় না), স্থানীয় ক্ষেত্রের বাইরে কোনও পার্শ্ব-প্রতিক্রিয়া নেই, কারণ এই নিয়োগটি aকেবলমাত্র পয়েন্টার আপডেট।

দ্বিতীয় ক্ষেত্রে, aপ্রকৃতপক্ষে নিজেকে সংশোধন করবে, সুতরাং সমস্ত উল্লেখগুলি aপরিবর্তিত সংস্করণটির দিকে নির্দেশ করবে। এটি নিম্নলিখিত কোড দ্বারা প্রদর্শিত হয়:

def copy_on_write(a):
      a = a + a
def inplace_add(a):
      a += a
a = [1]
copy_on_write(a)
print a # [1]
inplace_add(a)
print a # [1, 1]
b = 1
copy_on_write(b)
print b # [1]
inplace_add(b)
print b # 1

সুতরাং কৌশলটি হ'ল ফাংশন আর্গুমেন্টগুলিতে অগমেন্টেড অ্যাসাইনমেন্ট এড়ানো (আমি কেবল এটি স্থানীয় / লুপ ভেরিয়েবলের জন্য ব্যবহার করার চেষ্টা করি)। সাধারণ অ্যাসাইনমেন্ট ব্যবহার করুন এবং আপনি অস্পষ্ট আচরণ থেকে নিরাপদ থাকবেন।


2

পাইথন ইন্টারপ্রেটার সম্পূর্ণ ইউনিট হিসাবে কোনও ফাংশন পড়বে। আমি এটিকে দুটি পাসে পড়া হিসাবে মনে করি, একবার এটির বন্ধকরণ (স্থানীয় ভেরিয়েবলগুলি) সংগ্রহ করার জন্য, আবার এটি বাইট-কোডে পরিণত করার জন্য।

যেহেতু আমি নিশ্চিত যে আপনি ইতিমধ্যে সচেতন ছিলেন, একটি '=' এর বামে ব্যবহৃত যে কোনও নাম স্পষ্টতই স্থানীয় ভেরিয়েবল। একাধিকবার আমি একটি + = এ ভেরিয়েবল অ্যাক্সেস পরিবর্তন করে ধরা পড়েছি এবং হঠাৎ এটি একটি ভিন্ন পরিবর্তনশীল।

আমি এটিও উল্লেখ করতে চেয়েছিলাম যে এটি বিশ্বব্যাপী ক্ষেত্রের সাথে বিশেষভাবে করার কিছুই নয়। নেস্টেড ফাংশনগুলির সাথে আপনি একই আচরণ পান।


2

c+=1 নির্ধারণ c , পাইথন বরাদ্দ অনুমান ভেরিয়েবল স্থানীয়, কিন্তু এই ক্ষেত্রে এটি স্থানীয়ভাবে ঘোষিত হয় নি।

হয় globalবা nonlocalকীওয়ার্ড ব্যবহার করুন ।

nonlocal কেবল অজগর 3 এ কাজ করে, তাই যদি আপনি পাইথন 2 ব্যবহার করেন এবং আপনার পরিবর্তনশীলকে বিশ্বব্যাপী করতে না চান তবে আপনি একটি পরিবর্তনীয় অবজেক্টটি ব্যবহার করতে পারেন:

my_variables = { # a mutable object
    'c': 3
}

def test():
    my_variables['c'] +=1

test()

1

ক্লাস ভেরিয়েবলে পৌঁছানোর সর্বোত্তম উপায় হ'ল শ্রেণীর নাম দ্বারা সরাসরি অ্যাক্সেস করা

class Employee:
    counter=0

    def __init__(self):
        Employee.counter+=1

0

পাইথনে আমাদের সকল ধরণের ভেরিয়েবল স্থানীয়, বর্গ ভেরিয়েবল এবং গ্লোবাল ভেরিয়েবলের জন্য একই রকম ঘোষণা রয়েছে। আপনি যখন পদ্ধতি থেকে গ্লোবাল ভেরিয়েবল উল্লেখ করেন, অজগর মনে করে আপনি আসলে পদ্ধতি থেকে নিজেই পরিবর্তনশীল উল্লেখ করছেন যা এখনও সংজ্ঞায়িত হয়নি এবং তাই ত্রুটি ছুঁড়ে দেয়। গ্লোবাল ভেরিয়েবল উল্লেখ করতে আমাদের গ্লোবাল () ['ভেরিয়েবলনেম'] ব্যবহার করতে হবে।

আপনার ক্ষেত্রে যথাক্রমে a, b এবং c এর পরিবর্তে গ্লোবাল () ['a], গ্লোবাল () [' b '] এবং গ্লোবাল () [' c '] ব্যবহার করুন।


0

একই সমস্যা আমাকে বিরক্ত করে। ব্যবহার করে nonlocalএবং globalসমস্যার সমাধান করতে পারে।
তবে, মনোযোগ ব্যবহারের জন্য প্রয়োজন nonlocal, এটি নেস্টেড ফাংশনগুলির জন্য কাজ করে। তবে মডিউল স্তরে এটি কাজ করে না। উদাহরণ এখানে দেখুন ।

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