স্কোপিংয়ের নিয়মের সংক্ষিপ্ত বিবরণ?


472

পাইথন স্কোপিং বিধিগুলি ঠিক কী ?

আমার যদি কিছু কোড থাকে:

code1
class Foo:
   code2
   def spam.....
      code3
      for code4..:
       code5
       x()

কোথায় xপাওয়া যায়? কিছু সম্ভাব্য পছন্দ নীচের তালিকা অন্তর্ভুক্ত:

  1. বদ্ধ সোর্স ফাইলটিতে
  2. ক্লাস নেমস্পেসে
  3. ফাংশন সংজ্ঞা
  4. লুপ ইনডেক্স ভেরিয়েবলের জন্য
  5. লুপের ভিতরে

কার্যকর করার সময় প্রসঙ্গটিও রয়েছে, যখন ফাংশনটি spamঅন্য কোথাও পাস করা হয়। এবং সম্ভবত ল্যাম্বদা ফাংশন কিছুটা আলাদাভাবে পাস?

কোথাও একটি সাধারণ রেফারেন্স বা অ্যালগরিদম থাকতে হবে। মধ্যবর্তী পাইথন প্রোগ্রামারদের জন্য এটি একটি বিভ্রান্তিকর বিশ্ব।


2
Scoping নিয়ম মোটামুটি tersely বর্ণনা করা হয় - কিন্তু সম্পূর্ণরূপে - পাইথন ডকুমেন্টেশনে: docs.python.org/3/reference/...
jefe2000

উত্তর:


420

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

এলইজিবি বিধি

  • L ocal - কোনও ফাংশন ( defবা lambda) এর মধ্যে যে কোনও উপায়ে নাম নির্ধারিত , এবং সেই ফাংশনে বিশ্বব্যাপী ঘোষিত নয়

  • এনক্লোজিং-ফাংশন - যে কোনও এবং সমস্ত স্ট্যাটিক্যালি এনক্লোজিং ফাংশনগুলির ( defবা lambda) অভ্যন্তরীণ থেকে বাইরের দিকে স্থানীয় স্কোপগুলিতে অর্পিত নামগুলি

  • জি লোবল (মডিউল) - মডিউল ফাইলের শীর্ষ স্তরের নাম নির্ধারিত, বা ফাইলের globalমধ্যে একটি বিবৃতি কার্যকর defকরে

  • বি : - uilt-ইন (পাইথন) জন ব্যক্তির নাম বিল্ট-ইন নাম মডিউলে preassigned open, range, SyntaxError, ইত্যাদি

সুতরাং, ক্ষেত্রে

code1
class Foo:
    code2
    def spam():
        code3
        for code4:
            code5
            x()

forলুপ নিজস্ব নামস্থান নেই। এলইজিবি ক্রমে স্কোপগুলি হবে

  • এল: স্থানীয়তে def spam(ইন code3, code4এবং code5)
  • ই: যে কোনও সংযুক্তি কার্য (যদি পুরো উদাহরণটি অন্যটিতে থাকে def)
  • জি: xমডিউলে (ইন code1) কোনও বিশ্বব্যাপী ঘোষিত ছিল ?
  • বি: xপাইথনের কোনও বিল্টিন

xকখনই খুঁজে পাওয়া যাবে না code2(এমনকি এমন ক্ষেত্রেও যেখানে আপনি এটি আশা করতে পারেন, অ্যান্টির উত্তর বা এখানে দেখুন )।


45
গ্লোবাল অ্যাক্সেসের সতর্কতা হিসাবে - গ্লোবাল ভেরিয়েবল পড়া সুস্পষ্ট ঘোষণা ছাড়াই ঘটতে পারে তবে বৈশ্বিক (বর্ণ_নাম) ঘোষণা না করে এটি লেখার পরিবর্তে এটি একটি নতুন স্থানীয় উদাহরণ তৈরি করবে।
পিটার গিবসন

12
আসলে @ পিটার, global(var_name)সিন্টেক্সিকভাবে ভুল incor সঠিক বাক্য গঠন বিন্যাস global var_nameছাড়াই হবে । যদিও আপনার একটি বৈধ পয়েন্ট রয়েছে।
মার্টিনো

যদি তা হয় তবে নীচে কেন "f" এর "y" পরিবর্তনশীল নীচে "বার" তে দৃশ্যমান নয়: >>> def foo(x): ... y = x ... def bar(z): ... y = z ... bar(5) ... print x,y ... >>> foo(3) 3 3
জোনাথন মায়ার

3
@ জোনাথন: যেহেতু প্রত্যেককে yলেখা হয়েছে এবং কোনও global yঘোষণা নেই - @ পিটারের মন্তব্য দেখুন।
মার্টিনো

@ লক্ষ্মণপ্রসাদ এটি "ই" এর মধ্যে পড়ে, তবে এর একটি বিশেষ আচরণ রয়েছে যা উল্লেখ করার মতো: এটি একটি শ্রেণি পরিবর্তনশীল, তাই এটির বস্তুগুলির মধ্যে এটি একটি "গ্লোবাল"। এটি বরাদ্দ করা হবে unpredicted এবং ডিবাগ বিষয় কঠিন হতে যদি আপনি কি করছো তুমি জানি না।
Ctrl-C

157

মূলত, পাইথনের একমাত্র জিনিস যা একটি নতুন সুযোগের পরিচয় দেয় তা হ'ল ফাংশন সংজ্ঞা। ক্লাসগুলি একটি বিশেষ কেস যা দেহের মধ্যে প্রত্যক্ষভাবে সংজ্ঞায়িত যেকোন কিছু বর্গের নামস্থানে স্থাপন করা হয় তবে তারা যে পদ্ধতিগুলি (বা নেস্টেড ক্লাসগুলি) রাখে সেগুলি থেকে সরাসরি প্রবেশযোগ্য হয় না।

আপনার উদাহরণে কেবলমাত্র 3 টি স্কোপ রয়েছে যেখানে এক্স অনুসন্ধান করা হবে:

  • স্প্যামের সুযোগ - কোড 3 এবং কোড 5 এ সংজ্ঞায়িত সমস্ত কিছু (পাশাপাশি কোড 4, আপনার লুপ ভেরিয়েবল) রয়েছে

  • গ্লোবাল স্কোপ - কোড 1 এ সংজ্ঞায়িত সমস্ত কিছু রয়েছে, পাশাপাশি ফুও (এবং এর পরে যা কিছু পরিবর্তন হয়)

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

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

def foo():
    x=4
    def bar():
        print x  # Accesses x from foo's scope
    bar()  # Prints 4
    x=5
    bar()  # Prints 5

সীমাবদ্ধতা:

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

global_var1 = []
global_var2 = 1

def func():
    # This is OK: It's just accessing, not rebinding
    global_var1.append(4) 

    # This won't affect global_var2. Instead it creates a new variable
    global_var2 = 2 

    local1 = 4
    def embedded_func():
        # Again, this doen't affect func's local1 variable.  It creates a 
        # new local variable also called local1 instead.
        local1 = 5
        print local1

    embedded_func() # Prints 5
    print local1    # Prints 4

কার্যকারিতার ক্ষেত্রের মধ্যে থেকে গ্লোবাল ভেরিয়েবলের বাইন্ডিংগুলিকে সংশোধন করার জন্য আপনাকে অবশ্যই উল্লেখ করতে হবে যে বৈকল্পিকটি বিশ্বব্যাপী কীওয়ার্ড সহ বৈশ্বিক is উদাহরণ:

global_var = 4
def change_global():
    global global_var
    global_var = global_var + 1

বর্তমানে ফাংশন স্কোপগুলি ঘেরে ভেরিয়েবলগুলির জন্য একই কাজ করার কোনও উপায় নেই তবে পাইথন 3 একটি নতুন কীওয়ার্ড প্রবর্তন করে, nonlocalযা " " বিশ্বব্যাপী একইভাবে কাজ করবে তবে নেস্টেড ফাংশন স্কোপগুলির জন্য।


111

পাইথন 3 সময় সম্পর্কে কোনও সঠিক উত্তর ছিল না, তাই আমি এখানে একটি উত্তর দিয়েছি। এখানে বর্ণিত বেশিরভাগটি পাইথন 3 ডকুমেন্টেশনের নামের রেজোলিউশনে বিশদ বিবরণে রয়েছে ।

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

বিশেষত, এর বাইরে কোনও ব্লক বিবৃতি নেইdef এবং classএকটি ভেরিয়েবল সুযোগ তৈরি করে। পাইথন 2-তে একটি তালিকা বোধগম্য একটি পরিবর্তনশীল সুযোগ তৈরি করে না, তবে পাইথন 3-এ তালিকার বোধগমের মধ্যে লুপ ভেরিয়েবলটি একটি নতুন সুযোগে তৈরি করা হয়েছে।

শ্রেণিবদ্ধের অদ্ভুততা প্রদর্শন করা

x = 0
class X(object):
    y = x
    x = x + 1 # x is now a variable
    z = x

    def method(self):
        print(self.x) # -> 1
        print(x)      # -> 0, the global x
        print(y)      # -> NameError: global name 'y' is not defined

inst = X()
print(inst.x, inst.y, inst.z, x) # -> (1, 0, 1, 0)

সুতরাং ফাংশন বডি থেকে পৃথক, আপনি একই নামের সাথে একটি বর্গ ভেরিয়েবল পেতে, শ্রেণীর শরীরের একই পরিবর্তে ভেরিয়েবলটি পুনরায় সাইন করতে পারেন; এই নামে আরও অনুসন্ধানগুলি পরিবর্তে ক্লাস ভেরিয়েবলের সমাধান করুন।


পাইথনের কাছে নতুন আগতদের কাছে সবচেয়ে বড় আশ্চর্যের একটি হ'ল forলুপ কোনও পরিবর্তনশীল সুযোগ তৈরি করে না। পাইথন 2-এ তালিকার বোধগম্যতাগুলি কোনও সুযোগ তৈরি করে না (যখন জেনারেটর এবং ডিক বোঝাপড়া করে!) পরিবর্তে তারা ফাংশনে বা বিশ্বব্যাপী সুযোগগুলিতে মান ফাঁস করে:

>>> [ i for i in range(5) ]
>>> i
4

পাইথন 2-এ ল্যাম্বডা এক্সপ্রেশনগুলির মধ্যে পরিবর্তনযোগ্য পরিবর্তনশীলগুলি তৈরি করার ধূর্ততা (বা আপনি যদি ভয়ঙ্কর হবেন) হিসাবে ব্যবহার করতে পারেন - ল্যাম্বডা এক্সপ্রেশনটি একটি বিবরণীয় স্কোপ তৈরি করে, যেমন defবিবৃতি দেয়, তবে ল্যাম্বদার অভ্যন্তরে কোনও বিবৃতি অনুমোদিত নয়। পাইথনে স্টেটমেন্ট হওয়ার অর্থ হ'ল ল্যাম্বডায় কোনও ভেরিয়েবল অ্যাসাইনমেন্টের অনুমতি নেই তবে একটি তালিকা বোধগম্যতা একটি অভিব্যক্তি ...

পাইথন 3 এ এই আচরণটি স্থির করা হয়েছে - কোনও বোধগম্যতা বা জেনারেটর ফাঁস ভেরিয়েবলগুলি।


গ্লোবাল মানেই মডিউল স্কোপ; প্রধান পাইথন মডিউলটি হ'ল __main__; সমস্ত আমদানি করা মডিউলগুলি sys.modulesভেরিয়েবলের মাধ্যমে অ্যাক্সেসযোগ্য ; __main__এক অ্যাক্সেস পেতে ব্যবহার করতে পারেন sys.modules['__main__'], বা import __main__; এটি অ্যাক্সেস এবং সেখানে বৈশিষ্ট্য নির্ধারণ করতে পুরোপুরি গ্রহণযোগ্য; তারা মূল মডিউলটির বৈশ্বিক স্কোপে পরিবর্তনশীল হিসাবে প্রদর্শিত হবে।


যদি বর্তমানের স্কোপে (শ্রেণীর ক্ষেত্র ব্যতীত) কোনও নাম নির্ধারিত হয় তবে তা সেই ক্ষেত্রের অন্তর্ভুক্ত বলে বিবেচিত হবে, অন্যথায় এটি ভেরিয়েবলের জন্য বরাদ্দকৃত কোনও সংযুক্তি স্কোপের সাথে সম্পর্কিত বলে বিবেচিত হবে (এটি নির্ধারিত নাও হতে পারে এখনও, বা একেবারেই নয়), বা শেষ পর্যন্ত বিশ্ব সুযোগ scope যদি ভেরিয়েবলটিকে স্থানীয় হিসাবে বিবেচনা করা হয়, তবে এটি এখনও সেট করা হয়নি বা মুছে ফেলা হয়েছে তবে ভেরিয়েবলের মানটি পড়ার ফলস্বরূপ UnboundLocalError, এটি একটি সাবক্লাস NameError

x = 5
def foobar():
    print(x)  # causes UnboundLocalError!
    x += 1    # because assignment here makes x a local variable within the function

# call the function
foobar()

সুযোগটি ঘোষণা করতে পারে যে এটি গ্লোবাল কীওয়ার্ড সহ স্পষ্টতই গ্লোবাল (মডিউল স্কোপ) পরিবর্তনশীলটি পরিবর্তন করতে চায়:

x = 5
def foobar():
    global x
    print(x)
    x += 1

foobar() # -> 5
print(x) # -> 6

এটি বিস্তৃত ক্ষেত্রের ছায়ায় ছড়িয়ে থাকলেও এটি সম্ভব:

x = 5
y = 13
def make_closure():
    x = 42
    y = 911
    def func():
        global x # sees the global value
        print(x, y)
        x += 1

    return func

func = make_closure()
func()      # -> 5 911
print(x, y) # -> 6 13

অজগর 2 এ সংযুক্তি সুযোগে মানটি পরিবর্তন করার কোনও সহজ উপায় নেই; সাধারণত এটি একটি পরিবর্তনীয় মান দ্বারা সিমুলেট করা হয়, যেমন 1 দৈর্ঘ্যের একটি তালিকা:

def make_closure():
    value = [0]
    def get_next_value():
        value[0] += 1
        return value[0]

    return get_next_value

get_next = make_closure()
print(get_next()) # -> 1
print(get_next()) # -> 2

তবে অজগর 3 এ, nonlocalউদ্ধার করতে আসে:

def make_closure():
    value = 0
    def get_next_value():
        nonlocal value
        value += 1
        return value
    return get_next_value

get_next = make_closure() # identical behavior to the previous example.

nonlocalডকুমেন্টেশন বলছেন যে

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

অর্থাত্ nonlocalসর্বদা অন্তর্নির্মিত বহিরাগত অ-বৈশ্বিক সুযোগকে বোঝায় যেখানে নামটি আবদ্ধ হয়েছে (অর্থাত্ লক্ষ্যযুক্ত forভেরিয়েবল হিসাবে ব্যবহৃত হয়েছে, withক্লজটিতে অথবা কোনও ফাংশন প্যারামিটার হিসাবে)।


বর্তমান স্কোপ বা কোনও সংলগ্ন সুযোগের স্থানীয় হিসাবে বিবেচিত না এমন কোনও পরিবর্তনীয় একটি বৈশ্বিক পরিবর্তনশীল। মডিউল গ্লোবাল অভিধানে একটি বিশ্বব্যাপী নাম সন্ধান করা হয়; যদি খুঁজে না পাওয়া যায় তবে গ্লোবালটি বিল্টিন্স মডিউল থেকে সন্ধান করা হবে; মডিউলটির নাম অজগর 2 থেকে অজগর 3 করা হয়েছিল; পাইথন 2 এ এটি ছিল __builtin__এবং অজগর 3 এ এখন বলা হয় builtins। যদি আপনি বিল্টিনস মডিউলটির কোনও বৈশিষ্ট্য নির্ধারণ করে থাকেন তবে এটি পরে কোনও পঠনযোগ্য গ্লোবাল ভেরিয়েবল হিসাবে কোনও মডিউলের কাছে দৃশ্যমান হবে, যদি না যে মডিউলটি একই নামের সাথে তার নিজস্ব বৈকল্পিকের সাথে শেড করে না।


অন্তর্নির্মিত মডিউল পড়াও দরকারী হতে পারে; মনে করুন যে আপনি ফাইলের কিছু অংশে পাইথন 3 স্টাইলের মুদ্রণ ফাংশন চান তবে ফাইলের অন্যান্য অংশগুলি এখনও printস্টেটমেন্টটি ব্যবহার করে । পাইথন ২.6-২..7 এ আপনি পাইথন 3 printফাংশনটি এর সাথে ধরে রাখতে পারেন :

import __builtin__

print3 = __builtin__.__dict__['print']

পাইথন 2- এ from __future__ import print_functionপ্রকৃতপক্ষে কোনও printস্থানে আমদানি করা হয় না - পরিবর্তে এটি কেবলমাত্র printবর্তমান মডিউলে বিবৃতি দেওয়ার জন্য পার্সিং বিধিগুলি অক্ষম করে , printঅন্য কোনও পরিবর্তনশীল শনাক্তকারীর মতো পরিচালনা করে এবং এভাবে printবিল্টিনগুলিতে ফাংশনটি সন্ধান করতে দেয়।


23

পাইথন ২.x এর স্কোপিং বিধিগুলি ইতিমধ্যে অন্যান্য উত্তরে বর্ণিত হয়েছে। কেবলমাত্র আমি যুক্ত করব পাইথন 3.0.০ এ, একটি অ-স্থানীয় সুযোগের ধারণাও রয়েছে ('ননলোকাল' কীওয়ার্ড দ্বারা নির্দেশিত)। এটি আপনাকে সরাসরি বাইরের স্কোপগুলিতে অ্যাক্সেস করার অনুমতি দেয় এবং লেক্সিকাল ক্লোজার (কিছু পরিবর্তনীয় বস্তু জড়িত কুশ্রী হ্যাক ছাড়াই) সহ কিছু ঝরঝরে কৌশলগুলি করার ক্ষমতা উন্মুক্ত করে।

সম্পাদনা: এ সম্পর্কে আরও তথ্যের সাথে এখানে পিইপি দেওয়া আছে।


23

সুযোগের সামান্য আরও সম্পূর্ণ উদাহরণ:

from __future__ import print_function  # for python 2 support

x = 100
print("1. Global x:", x)
class Test(object):
    y = x
    print("2. Enclosed y:", y)
    x = x + 1
    print("3. Enclosed x:", x)

    def method(self):
        print("4. Enclosed self.x", self.x)
        print("5. Global x", x)
        try:
            print(y)
        except NameError as e:
            print("6.", e)

    def method_local_ref(self):
        try:
            print(x)
        except UnboundLocalError as e:
            print("7.", e)
        x = 200 # causing 7 because has same name
        print("8. Local x", x)

inst = Test()
inst.method()
inst.method_local_ref()

আউটপুট:

1. Global x: 100
2. Enclosed y: 100
3. Enclosed x: 101
4. Enclosed self.x 101
5. Global x 100
6. global name 'y' is not defined
7. local variable 'x' referenced before assignment
8. Local x 200

6
এটি দুর্দান্ত উত্তর। যাইহোক, আমি মনে করি যে মধ্যে পার্থক্য methodএবং method_local_refহাইলাইট করা উচিত নয়। methodগ্লোবাল ভেরিয়েবল অ্যাক্সেস করতে এবং এটিকে প্রিন্ট করতে সক্ষম 5. Global x। তবে method_local_refপরে এটি একই নামের সাথে একটি স্থানীয় ভেরিয়েবল সংজ্ঞায়িত করতে পারে না। আপনি x = 200লাইনটি সরিয়ে
এটির

@ ব্রায়ানরে: জেড কি হবে?
মালিক এ রুমী

@ কিরিল আমি সে সম্পর্কে একটি নোট যুক্ত করেছি
ব্রায়ানরে

@ মালিকআ.রোমি আমি জেড সরিয়েছি কারণ এটি আকর্ষণীয় ছিল না
ব্রায়ানরে

আশ্চর্যের বিষয় হল , পাইথন স্কোপগুলির এটিই একমাত্র স্পষ্ট ব্যাখ্যা, যা আমি সমস্ত এসওতে খুঁজে পেতে পারি। কেবল একটি খুব মৌলিক উদাহরণ ব্যবহার করে। ধন্যবাদ!
not2qubit

13

পাইথন আপনার ভেরিয়েবলগুলি সমাধান করে - সাধারণত - তিনটি নাম স্থান উপলব্ধ।

মৃত্যুদন্ড কার্যকর করার সময় যে কোনও সময়ে কমপক্ষে তিনটি নেস্টেড স্কোপ রয়েছে যার নামস্থানগুলি সরাসরি অ্যাক্সেসযোগ্য: অন্তর্নিহিত স্কোপটি, যা প্রথমে অনুসন্ধান করা হয়, এতে স্থানীয় নাম রয়েছে; যে কোনও এনকোলেজিং ফাংশনের নেমস্পেসগুলি, যা নিকটতম এনক্লোজিং স্কোপ দিয়ে শুরু করে অনুসন্ধান করা হয়; মাঝের সুযোগটি, পরবর্তী অনুসন্ধানে বর্তমান মডিউলটির বিশ্বব্যাপী নাম রয়েছে; এবং বাইরেরতম স্কোপ (সর্বশেষে অনুসন্ধান করা) হ'ল অন্তর্নির্মিত নাম সম্বলিত নাম স্থান।

দুটি ফাংশন রয়েছে: globalsএবং localsযা আপনাকে এই নেমস্পেসের দুটি বিষয়বস্তু প্রদর্শন করে।

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

এই ক্ষেত্রে, নামের একটি ক্রিয়াকলাপের কলটি xস্থানীয় নাম স্থান বা গ্লোবাল নেমস্পেসে সমাধান করতে হবে।

এই ক্ষেত্রে স্থানীয়, পদ্ধতি ফাংশন প্রধান Foo.spam

গ্লোবাল হ'ল - ভাল - গ্লোবাল।

বিধিটি হ'ল পদ্ধতি ফাংশন (এবং নেস্টেড ফাংশন সংজ্ঞা) দ্বারা তৈরি নেস্টেড লোকাল স্পেসগুলি অনুসন্ধান করা, তারপরে বিশ্বব্যাপী অনুসন্ধান করা। এটাই.

অন্য কোনও স্কোপ নেই। forবিবৃতি (এবং মত অন্যান্য যৌগ বিবৃতি ifএবং try) নতুন নেস্টেড সুযোগ তৈরি করবেন না। কেবলমাত্র সংজ্ঞা (প্যাকেজ, মডিউল, ফাংশন, শ্রেণি এবং অবজেক্টের উদাহরণ)

শ্রেণীর সংজ্ঞার ভিতরে, নামগুলি বর্গের নেমস্পেসের অংশ। code2উদাহরণস্বরূপ, অবশ্যই শ্রেণীর নাম দ্বারা যোগ্যতা অর্জন করতে হবে। সাধারণত Foo.code2। যাইহোক, self.code2এছাড়াও কাজ করবে কারণ পাইথন অবজেক্টসটি একটি ক্লাস-ব্যাক হিসাবে থাকা বর্গটিকে দেখায়।

একটি বস্তুর (একটি শ্রেণীর উদাহরণ) উদাহরণ ভেরিয়েবল রয়েছে। এই নামগুলি অবজেক্টের নেমস্পেসে রয়েছে। তারা অবশ্যই বস্তু দ্বারা যোগ্য হতে হবে। ( variable.instance।)

একটি শ্রেণিবদ্ধ পদ্ধতি থেকে আপনার স্থানীয় এবং গ্লোবাল রয়েছে have আপনি self.variableউদাহরণটিকে নাম স্থান হিসাবে বেছে নিতে বলেছেন । আপনি নোট করবেন যে selfএটি প্রতিটি শ্রেণীর সদস্য ফাংশনের পক্ষে যুক্তি, এটি স্থানীয় নেমস্পেসের অংশ হিসাবে তৈরি করে।

দেখুন পাইথন ব্যাপ্তি রুলস , পাইথন ব্যাপ্তি , চলক ব্যাপ্তি


5
এটি পুরানো। ২.১ (years বছর আগে) থেকে দুটিরও বেশি স্কোপ রয়েছে, যেমন নেস্টেড ফাংশনগুলি নতুন স্কোপগুলি প্রবর্তন করে, সুতরাং কোনও ফাংশনের অভ্যন্তরে কোনও ফাংশনের তার স্থানীয় সুযোগ, ঘেরযুক্ত ফাংশনগুলির সুযোগ এবং বিশ্বব্যাপী সুযোগ (বিল্টিনস) অ্যাক্সেস থাকবে।
ব্রায়ান

আমি দুঃখিত, এটি আর হয় না। Python has two namespaces available. Global and local-to-something.
রিজওয়ান কাসিম

9

এক্স কোথায় পাওয়া যায়?

আপনি এটি সংজ্ঞায়িত না করে x খুঁজে পাওয়া যায় নি। :-) আপনি যদি এটি রাখেন তবে এটি কোড 1 (গ্লোবাল) বা কোড3 (স্থানীয়) এ পাওয়া যাবে।

কোড 2 (শ্রেণীর সদস্যরা) একই বর্গের অভ্যন্তরীণ পদ্ধতির কোডে দৃশ্যমান নয় - আপনি সাধারণত সেগুলি স্ব ব্যবহার করে অ্যাক্সেস করতে পারেন। কোড4 / কোড 5 (লুপস) কোড3 এর মতো একই স্কোপে বাস করে, তাই আপনি যদি সেখানে x লিখেন তবে আপনি কোড 3 এ সংজ্ঞায়িত এক্স উদাহরণটি পরিবর্তন করবেন, একটি নতুন এক্স না করে।

পাইথনটি স্থিতিশীলভাবে স্কোপযুক্ত, সুতরাং আপনি যদি অন্য কোনও ফাংশন স্প্যামের কাছে 'স্প্যাম' পাস করেন তবে এটি মডিউলটিতে (কোড 1 সংজ্ঞায়িত), এবং অন্য যে কোনও স্কোপযুক্ত রয়েছে (নীচে দেখুন) এর গ্লোবালগুলিতে অ্যাক্সেস পাবে। কোড 2 সদস্যদের আবার স্ব দ্বারা অ্যাক্সেস করা হবে।

ল্যাম্বদা ডিএফ থেকে আলাদা নয়। যদি কোনও ফাংশনের অভ্যন্তরে ল্যাম্বদা ব্যবহার করা হয় তবে এটি নেস্টেড ফাংশনটি সংজ্ঞায়িত করার সমান। পাইথন ২.২ এর পরে, নেস্টেড স্কোপগুলি উপলব্ধ। এই ক্ষেত্রে আপনি ফাংশন নেস্টিংয়ের যে কোনও স্তরে এক্স বেঁধে রাখতে পারেন এবং পাইথন আন্তঃতম উদাহরণটি বেছে নেবে:

x= 0
def fun1():
    x= 1
    def fun2():
        x= 2
        def fun3():
            return x
        return fun3()
    return fun2()
print fun1(), x

2 0

মজা 3 নিকটতম ধারণকারী স্কোপ থেকে এক্স উদাহরণটি দেখবে, যা ফান 2 এর সাথে যুক্ত ফাংশন স্কোপ। তবে অন্যান্য এক্স উদাহরণস্বরূপ, ফান 1 এবং বিশ্বব্যাপী সংজ্ঞায়িত, প্রভাবিত হয় না।

নেস্টেড_স্কোপের আগে - পাইথনের প্রাক-২.১-এ, এবং ২.১-এ যদি আপনি ভবিষ্যত-আমদানি ব্যবহার করে বৈশিষ্ট্যটির জন্য বিশেষভাবে জিজ্ঞাসা না করেন - ফান 1 এবং ফান 2 এর স্কোপগুলি ফান 3-তে দৃশ্যমান নয়, সুতরাং এস.লোটের উত্তর ধরে এবং আপনি বিশ্বব্যাপী এক্স পাবেন :

0 0

1

পাইথনে,

কোনও ভেরিয়েবল যা একটি মান নির্ধারিত হয় তা নির্ধারিত ব্লকের সাথে স্থানীয়।

যদি বর্তমান স্কোপে কোনও পরিবর্তনীয় সন্ধান করতে না পারে তবে দয়া করে LEGB ক্রমটি দেখুন।

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