পাইথনে "গ্লোবাল" কীওয়ার্ড ব্যবহার করুন


285

ডকুমেন্টেশন পড়া থেকে আমি যা বুঝতে পারি তা হ'ল পাইথনের ফাংশনগুলির জন্য পৃথক নেমস্পেস রয়েছে এবং আমি যদি সেই ফাংশনে একটি বৈশ্বিক পরিবর্তনশীল ব্যবহার করতে চাই তবে আমার ব্যবহার করা দরকার global

আমি পাইথন ২.7 ব্যবহার করছি এবং আমি এই ছোট পরীক্ষাটি চেষ্টা করেছি

>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
...     return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'

দেখে মনে হচ্ছে জিনিসগুলি ব্যতীতও ঠিকঠাক কাজ করছে global। আমি কোনও সমস্যা ছাড়াই গ্লোবাল ভেরিয়েবল অ্যাক্সেস করতে সক্ষম হয়েছি।

আমি কি কিছু মিস করছি? এছাড়াও, পাইথন ডকুমেন্টেশন থেকে নিম্নলিখিত:

বিশ্বব্যাপী বিবৃতিতে তালিকাভুক্ত নামগুলি আনুষ্ঠানিক পরামিতি হিসাবে বা লুপ নিয়ন্ত্রণ লক্ষ্য, শ্রেণি সংজ্ঞা, ফাংশন সংজ্ঞা, বা আমদানির বিবৃতি হিসাবে সংজ্ঞায়িত করা উচিত নয়।

আনুষ্ঠানিক পরামিতি এবং শ্রেণি সংজ্ঞা আমার কাছে বোধগম্য হওয়ার সময় আমি লুপ নিয়ন্ত্রণ লক্ষ্য এবং ফাংশন সংজ্ঞা জন্য নিষেধাজ্ঞাকে বুঝতে সক্ষম নই।


1
আমার মনে হয় আপনি পিএইচপি নিয়ে বিভ্রান্ত হয়ে পড়েছেন যার জন্য গ্লোবাল কীওয়ার্ড ব্যবহার দরকার - পাইথন ডক্স এটি নিশ্চিত করে - মূলত যদি এটি স্থানীয় প্রেক্ষাপটে সংজ্ঞায়িত না হয় তবে এটি গ্লোবাল হিসাবে বিবেচিত হয়
tobyodavies

11
আপনার কথার সাথে সতর্ক থাকুন: পাইথনের ফাংশনগুলির জন্য পৃথক নেমস্পেস নেই (এর অর্থ হ'ল আপনি def foo(): ...এবং foo = ...একই সাথে থাকতে পারেন )। এটি প্রতিটি ফাংশন কলের জন্য একটি নতুন সুযোগ তৈরি করে। (তবে এটি বিশ্বের প্রতিটি অন্যান্য দূরবর্তী উচ্চ স্তরের ভাষার ভাষার থেকে কীভাবে আলাদা?)

উত্তর:


366

শব্দ globalযদিও গ্লোবাল ভেরিয়েবল তৈরি কদাপি একটি ভাল সমাধান বিবেচনা করা হয়, শুধুমাত্র পরিবর্তন বা একটি স্থানীয় প্রেক্ষাপটে গ্লোবাল ভেরিয়েবল তৈরি করতে দরকারী।

def bob():
    me = "locally defined"    # Defined only in local context
    print(me)

bob()
print(me)     # Asking for a global variable

উপরেরটি আপনাকে দেবে:

locally defined
Traceback (most recent call last):
  File "file.py", line 9, in <module>
    print(me)
NameError: name 'me' is not defined

আপনি যদি globalবিবৃতিটি ব্যবহার করেন তবে ভেরিয়েবলটি কার্যকরভাবে বিশ্বব্যাপী ভেরিয়েবলে পরিণত হয়ে ফাংশনের সুযোগ "বাইরে" উপলব্ধ হবে।

def bob():
    global me
    me = "locally defined"   # Defined locally but declared as global
    print(me)

bob()
print(me)     # Asking for a global variable

উপরের কোডটি আপনাকে দেবে:

locally defined
locally defined

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


59
"গ্লোবাল" এই প্রসঙ্গে "গ্লোবাল" অন্য ভাষা থেকে আলাদা বলে মনে হয় "গ্লোবাল" বিবেচনা করে। পাইথনে একটি "গ্লোবাল" রেফারেন্সটি এখনও মডিউলের সীমানায় রয়েছে এবং কেবলমাত্র "গ্লোবাল_ভার" হিসাবে প্রত্যাশার পরিবর্তে সেই "মডিউল.global_var" হিসাবে সেই মডিউলটির বাইরে থেকে উল্লেখ করা দরকার।
রস

17
@ জুইস - পাইথন-এ এমন কোনও জিনিস নেই globalsযা সমস্ত নেমস্পেসে স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত হয় (ধন্যবাদ)। আপনি সঠিকভাবে উল্লেখ করেছেন যে, একটি গ্লোবাল একটি মডিউলটির মধ্যে একটি নেমস্পেসের সাথে আবদ্ধ, তবে এটি অন্য মডিউলে from module import variableবা হিসাবে আমদানি করা যেতে পারে import module.variable। প্রথম ক্ষেত্রে, আমদানিটি হিসাবে চলক হিসাবে variableরেফারেন্সের প্রয়োজন ছাড়াই পরিবর্তনশীল অ্যাক্সেসযোগ্য করে তুলবে module.। যদি এটিকে মডিউলটির পরিসর হিসাবে বিশ্বব্যাপী বিবেচনা করা হয় তবে এটি কোথায় আমদানি করা হবে তার উপর নির্ভর করবে। nonlocalপাইথন 3
তে

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

5
@ রবিননহাউস ইতিমধ্যে এই বিষয়টি এবং অন্যান্য অ- নিবন্ধগুলি coveringাকতে ইতিমধ্যে কয়েকটি প্রশ্ন রয়েছে ।
আনোড করুন

213

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

foo = 1
def test():
    foo = 2 # new local foo

def blub():
    global foo
    foo = 3 # changes the value of the global foo

আপনার ক্ষেত্রে, আপনি কেবল তালিকাটি অ্যাক্সেস করছেন sub


3
একটি সতর্কতা সহ: foo = 3গ্লোবাল কাজ ছাড়াই, তবে foo স্থানীয়ভাবে blubফাংশন স্কোপে সংজ্ঞায়িত করা হয় এবং মূল ফু ভেরিয়েবলটি সংশোধন করে না। এটি আমার কাছে বেশ বিভ্রান্তিকর ছিল।
ছানতাল

1
@ ছন্তিয়াল যদি কাজ করে আপনার বোঝায় যে এটি কোনও ত্রুটি ফেলে না, আপনি সঠিক, তবে আইভো ওয়েটজেলের প্রসঙ্গে এটি উদ্দেশ্য হিসাবে কাজ করবে না functioning এই জাতীয় আচরণের জন্য ব্যবহার রয়েছে তবে প্রোগ্রামার যা চায় তা প্রায়শই হয় না।
গণতন্ত্রবিদ

77

নাম অ্যাক্সেস করা এবং এটি একটি সুযোগের মধ্যে আবদ্ধ করার মধ্যে পার্থক্য ।

যদি আপনি কেবল তার মানটি পড়তে কোনও পরিবর্তনশীল সন্ধান করেন তবে আপনি বিশ্বব্যাপী পাশাপাশি স্থানীয় সুযোগেও অ্যাক্সেস পেয়ে গেছেন।

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

আপনি যদি বিশ্বব্যাপী নামটি অর্পণ করতে সক্ষম হতে চান তবে আপনাকে পার্সারকে নতুন স্থানীয় নামের সাথে আবদ্ধ না করে গ্লোবাল নামটি ব্যবহার করতে বলার দরকার - যা 'গ্লোবাল' কীওয়ার্ডটি করে।

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

>>> a = 1
>>> def p():
    print(a) # accessing global scope, no binding going on
>>> def q():
    a = 3 # binding a name in local scope - hiding global
    print(a)
>>> def r():
    print(a) # fail - a is bound to local scope, but not assigned yet
    a = 4
>>> p()
1
>>> q()
3
>>> r()
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    r()
  File "<pyshell#32>", line 2, in r
    print(a) # fail - a is bound to local scope, but not assigned yet
UnboundLocalError: local variable 'a' referenced before assignment
>>> 

খুব পাল্টা, বিশ্বাস করা শক্ত যে এটি বৈধ অজগর কোড
PlsWork

52

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

এটি বিবেচনা করুন, উদাহরণস্বরূপ:

value = 42

def doit():
    print value
    value = 0

doit()
print value

আপনি সম্ভবত অনুমান করতে পারেন যে value = 0বিবৃতিটি স্থানীয় ভেরিয়েবলকে বরাদ্দ করবে এবং doit()ফাংশনের বাইরে ঘোষিত একই ভেরিয়েবলের মান প্রভাবিত করবে না । উপরের কোডটি চলবে না তা জানতে আপনি আরও অবাক হতে পারেন print valueফাংশনের ভিতরে বিবৃতি একটি উত্পাদন করেUnboundLocalError.

কারণ পাইথন লক্ষ্য করেছে যে ফাংশন অন্য কোথাও, আপনি নাম নির্ধারণ value, এবং valueকোথাও ঘোষণা করা হয় নি global। এটি এটিকে স্থানীয় পরিবর্তনশীল করে তোলে। আপনি যখন এটি মুদ্রণের চেষ্টা করবেন তখন স্থানীয় নামটি এখনও সংজ্ঞায়িত হয়নি। এক্ষেত্রে পাইথন আর কিছু ভাষায় যেমন বৈশ্বিক চলক হিসাবে নামটি খুঁজতে ফিরে যায় না। মূলত, আপনি যদি ফাংশনের যে কোনও জায়গায় একই নামের স্থানীয় ভেরিয়েবলটি সংজ্ঞায়িত করে থাকেন তবে আপনি বৈশ্বিক চলক অ্যাক্সেস করতে পারবেন না ।


1
এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ. সুতরাং, যতক্ষণ না আপনার স্থানীয় সুযোগটি এর বাইরে বিদ্যমান কোনও নামকে অর্পণ করে না, ততক্ষণ স্থানীয় ক্ষেত্রের উল্লেখগুলি বাইরের নামটি ব্যবহার করবে। যাইহোক, যদি আপনার কার্যক্রমে কোথাও আপনি সেই নামটি অর্পণ করেন, স্থানীয় কার্যভারের উল্লেখ, এমনকি স্থানীয় কার্যভারের আগে, বাইরে তাকান না।
দিমিত্রি মিনকভস্কি

1
ঠিক আছে, আপনি এটি পেয়েছেন। global(বা nonlocalপাইথন 3.x এ) এই আচরণটিকে ওভাররাইড করে এবং আপনাকে বাহ্যিক নামটি পুনরায় বরাদ্দ করতে দেয়।
kindall

2
অন্যান্য ভাষায়, এটি "উত্তোলন" হিসাবে উল্লেখ করা হয়েছে বলে মনে হয়, উদাহরণস্বরূপ: github.com/shichuan/javascript-patterns/blob/master/…
দিমিত্রি মিনকভস্কি

আঘাত থেকে অপমান যোগ করতে, ভেরিয়েবল নতুন জাভাস্ক্রিপ্ট শব্দ ঘোষিত letহয় না উত্তোলন করেন।
17:30 এ কিনুন

ঘোষিত গ্লোবাল ভেরিয়েবলটি অ্যাক্সেস করা কি দ্রুত global?
মাটো

14

একটি নাম অ্যাক্সেস এবং একটি নাম নির্ধারণ করা আলাদা। আপনার ক্ষেত্রে, আপনি কেবল একটি নাম অ্যাক্সেস করছেন।

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

>>> x = 1         # global 
>>> def foo():
        print x       # accessing it, it is global

>>> foo()
1
>>> def foo():   
        x = 2        # local x
        print x 

>>> x            # global x
1
>>> foo()        # prints local x
2

7
  • আপনি কীওয়ার্ড ছাড়াই গ্লোবাল কীওয়ার্ডগুলি অ্যাক্সেস করতে পারেন global
  • এগুলি সংশোধন করতে আপনাকে স্পষ্টভাবে বলতে হবে যে কীওয়ার্ডটি বিশ্বব্যাপী। অন্যথায়, কীওয়ার্ডটি স্থানীয় স্কোপে ঘোষণা করা হবে।

উদাহরণ:

words = [...] 

def contains (word): 
    global words             # <- not really needed
    return (word in words) 

def add (word): 
    global words             # must specify that we're working with a global keyword
    if word not in words: 
        words += [word]

2

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


1

পাইথন এফএকিউতে এটি ভালভাবে ব্যাখ্যা করা হয়েছে

পাইথনে স্থানীয় এবং গ্লোবাল ভেরিয়েবলের নিয়ম কী?

পাইথনে, কেবলমাত্র কোনও ফাংশনের অভ্যন্তরে উল্লেখযোগ্য ভেরিয়েবলগুলি পুরোপুরি গ্লোবাল are যদি কোনও ভেরিয়েবলটিকে ফাংশনটির দেহের অভ্যন্তরে কোথাও একটি মান নির্ধারিত করা হয়, তবে এটি স্পষ্টভাবে বিশ্বব্যাপী হিসাবে ঘোষিত না হলে এটি স্থানীয় হিসাবে ধরে নেওয়া হবে।

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

https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python


0

এর অর্থ হল যে আপনাকে নিম্নলিখিতগুলি করা উচিত নয়:

x = 1

def myfunc():
  global x

  # formal parameter
  def localfunction(x):
    return x+1

  # import statement
  import os.path as x

  # for loop control target
  for x in range(10):
    print x

  # class definition
  class x(object):
    def __init__(self):
      pass

  #function definition
  def x():
    print "I'm bad"

আইকোস্টিয়া বিশ্বব্যাপী ব্যবহার করার জন্য 'এক্স' ব্যবহার করতে পারবেন না এমন সমস্ত জিনিস গণনা করছে - ডকস.পিথন.অর্গ
রেফারেন্স

1
@ ইউনোড: নিখিল রাঠোদ তার উদ্ধৃতিতে যে সমস্ত মামলা দিয়েছিলেন তা আমি কেবল প্রদর্শন করছি।
ikostia

0

গ্লোবাল পরিবর্তনশীল "গ্লোবাল" করে তোলে

def out():
    global x
    x = 1
    print(x)
    return


out()

print (x)

এটি 'x' ফাংশনের বাইরে সাধারণ ভেরিয়েবলের মতো কাজ করে। আপনি যদি বিশ্বব্যাপী বাইরে চলে যান তবে এটি কোনও ত্রুটি দেয় কারণ এটি কোনও ফাংশনের অভ্যন্তরে ভেরিয়েবল মুদ্রণ করতে পারে না।

def out():
     # Taking out the global will give you an error since the variable x is no longer 'global' or in other words: accessible for other commands
    x = 1
    print(x)
    return


out()

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