파이썬에서 "글로벌"키워드 사용


285

문서를 읽음으로써 이해하는 것은 Python에는 함수에 대한 별도의 네임 스페이스가 있으며 해당 함수에서 전역 변수를 사용하려면을 사용해야한다는 것 global입니다.

Python 2.7을 사용하고 있으며이 작은 테스트를 시도했습니다.

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

없이도 잘 작동하는 것 같습니다 global. 아무런 문제없이 전역 변수에 액세스 할 수있었습니다.

아무것도 빠졌습니까? 또한 다음은 Python 설명서입니다.

글로벌 명령문에 나열된 이름은 공식 매개 변수 또는 for 루프 제어 대상, 클래스 정의, 함수 정의 또는 가져 오기 명령문으로 정의되어서는 안됩니다.

공식적인 매개 변수와 클래스 정의가 의미가 있지만 루프 제어 대상 및 함수 정의에 대한 제한 사항을 이해할 수 없습니다.


1
나는 당신이 글로벌 키워드의 사용을 필요로 PHP와 혼동 생각 - 파이썬 문서는이를 확인 -이 로컬 컨텍스트에 정의되어 있지 않은 경우 basicly가 글로벌로 처리됩니다
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"보다는 "module.global_var"로 해당 모듈 외부에서 참조되어야합니다.
주스

17
@juice-파이썬에서는 globals모든 네임 스페이스에서 자동 으로 절대적 으로 정의 되는 것과 같은 것은 없습니다 (감사합니다). 올바르게 지적했듯이 전역은 모듈 내 네임 스페이스에 바인딩되지만 from module import variable또는 로 다른 모듈로 가져올 수 있습니다 import module.variable. 첫 번째 경우, 가져 오기는 variable로 참조하지 않아도 변수에 액세스 할 수있게합니다 module.. 모듈 범위에서 전역으로 간주되는 경우 가져온 위치에 따라 다릅니다. nonlocalpython 3의 새로운 범위 관련 키워드로 도 참조하십시오.
unode

3
전역 변수가 좋은 솔루션이 아닌 이유를 설명해 주시겠습니까? 나는 종종 이것을 들었지만, 현재 프로젝트에서 그들은 내가해야 할 일을하는 것처럼 보인다. 내가 생각하지 못한 더 불길한 것이 있습니까?
Robin Newhouse

5
@RobinNewhouse SO에 대해서는 이미 주제 와 다른 기사 이외의 기사를 다루는 몇 가지 질문이 있습니다 .
unode

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함수 범위 에서 로컬로 다시 정의되며 원래 foo 변수를 수정하지 않습니다. 이것은 나에게 매우 혼란 스러웠다.
chhantyal

1
@chhantyal 작동하면 오류가 발생하지 않는다는 것을 의미하지만 정확하지만 Ivo Wetzel의 컨텍스트에서는 의도 한대로 작동하지 않습니다. 그러한 행동에는 용도가 있지만 프로그래머가 원하는 것은 아닙니다.
democidist

77

이것은 이름에 액세스하는 것과 범위 내에서 바인딩 하는 것의 차이점 입니다.

값을 읽기 위해 변수를 찾으려면 전역 범위와 로컬 범위에 액세스 할 수 있습니다.

그러나 이름이 로컬 범위에없는 변수에 할당하면 해당 이름을이 범위에 바인딩 하는 것입니다 (해당 이름도 전역으로 존재하면 숨길 수 있습니다).

전역 이름에 할당하려면 파서에게 새로운 전역 이름을 바인딩하는 대신 전역 이름을 사용하도록 지시해야합니다. 이는 'global'키워드의 기능입니다.

블록 내의 아무 곳이나 바인딩하면 해당 블록의 모든 곳에서 이름이 바인딩되어 다소 이상한 결과가 발생할 수 있습니다 (예 : UnboundLocalError가 이전에 작동하는 코드에 갑자기 나타남).

>>> 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.

그 이유는 파이썬이 함수의 다른 곳에서 name을 할당하고 어디 value에서도 value선언되지 않았 음을 알았 기 때문입니다 global. 그것이 지역 변수입니다. 그러나 인쇄하려고 할 때 로컬 이름이 아직 정의되지 않았습니다. 이 경우 파이썬은 다른 언어와 마찬가지로 이름을 전역 변수로 찾는 것으로 돌아 가지 않습니다. 기본적으로 함수의 어느 곳에 나 같은 이름의 로컬 변수를 정의한 경우 전역 변수에 액세스 할 수 없습니다 .


1
이것을 지적 해 주셔서 감사합니다. 따라서 로컬 범위가 외부에 존재하는 이름에 할당되지 않는 한 로컬 범위의 참조는 외부 이름을 사용합니다. 그러나 함수의 어느 곳에서나 해당 이름을 할당하면 해당 로컬 범위의 참조는 로컬 할당 전에도 외부를 보지 않습니다.
Dmitry Minkovsky

1
정확히 그렇습니다. global(또는 nonlocalPython 3.x에서)이 동작을 재정의하고 외부 이름을 다시 할당 할 수 있습니다.
kindall

2
다른 언어에서는 이것을 다음과 같이 "게양"이라고합니다. github.com/shichuan/javascript-patterns/blob/master/…
Dmitry

부상을 입히기 위해 최신 JavaScript 키워드 let로 선언 된 변수는 게양 되지 않습니다 .
kindall

로 선언 된 전역 변수에 액세스하는 것이 더 빠르 global거나 중요하지 않습니까?
mato

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

이것은 파이썬 FAQ에 잘 설명되어 있습니다.

파이썬에서 지역 및 전역 변수에 대한 규칙은 무엇입니까?

파이썬에서 함수 내에서만 참조되는 변수는 암시 적으로 전역 적입니다. 변수가 함수 본문 내 어디에서나 값을 할당하면 명시 적으로 전역으로 선언되지 않는 한 지역 변수로 간주됩니다.

처음에는 조금 놀랐지 만 잠시 생각해 보자. 한편으로, 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"

- ikostia 당신이 'X'사용을 위해 할 수있는 모든 일을 열거되어 글로벌 사용하는 데 docs.python.org/reference/...
pycruft

1
@ Unode : NikhilRathod가 인용 한 모든 사례를 보여줍니다.
ikostia

0

Global은 "Global"변수를 만듭니다

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.