문서를 읽음으로써 이해하는 것은 Python에는 함수에 대한 별도의 네임 스페이스가 있으며 해당 함수에서 전역 변수를 사용하려면을 사용해야한다는 것 global
입니다.
Python 2.7을 사용하고 있으며이 작은 테스트를 시도했습니다.
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
없이도 잘 작동하는 것 같습니다 global
. 아무런 문제없이 전역 변수에 액세스 할 수있었습니다.
아무것도 빠졌습니까? 또한 다음은 Python 설명서입니다.
글로벌 명령문에 나열된 이름은 공식 매개 변수 또는 for 루프 제어 대상, 클래스 정의, 함수 정의 또는 가져 오기 명령문으로 정의되어서는 안됩니다.
공식적인 매개 변수와 클래스 정의가 의미가 있지만 루프 제어 대상 및 함수 정의에 대한 제한 사항을 이해할 수 없습니다.
답변
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
로컬 컨텍스트에서 함수, 클래스 또는 기타 객체를 선언 하는 데 사용할 수도 있습니다 . 무언가 잘못되거나 디버깅이 필요한 경우 악몽을 유발하기 때문에 그것에 대해 조언 할 것입니다.
답변
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
입니다.
답변
이것은 이름에 액세스하는 것과 범위 내에서 바인딩 하는 것의 차이점 입니다.
값을 읽기 위해 변수를 찾으려면 전역 범위와 로컬 범위에 액세스 할 수 있습니다.
그러나 이름이 로컬 범위에없는 변수에 할당하면 해당 이름을이 범위에 바인딩 하는 것입니다 (해당 이름도 전역으로 존재하면 숨길 수 있습니다).
전역 이름에 할당하려면 파서에게 새로운 전역 이름을 바인딩하는 대신 전역 이름을 사용하도록 지시해야합니다. 이는 ‘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
>>>
답변
다른 답변은 귀하의 질문에 답변합니다. 파이썬에서 이름에 대해 알아야 할 또 다른 중요한 점은 이름별로 로컬 또는 전역이라는 점입니다.
예를 들어 이것을 고려하십시오.
value = 42
def doit():
print value
value = 0
doit()
print value
당신은 아마 추측 할 수 value = 0
문이 지역 변수에 할당하지 같은 변수의 값은 외부의 선언에 영향을 줄 것이다 doit()
기능. 위의 코드가 실행되지 않는다는 사실에 놀랄 수도 있습니다 . print value
함수 내부 의 문장 은UnboundLocalError.
그 이유는 파이썬이 함수의 다른 곳에서 name을 할당하고 어디 value
에서도 value
선언되지 않았 음을 알았 기 때문입니다 global
. 그것이 지역 변수입니다. 그러나 인쇄하려고 할 때 로컬 이름이 아직 정의되지 않았습니다. 이 경우 파이썬은 다른 언어와 마찬가지로 이름을 전역 변수로 찾는 것으로 돌아 가지 않습니다. 기본적으로 함수의 어느 곳에 나 같은 이름의 로컬 변수를 정의한 경우 전역 변수에 액세스 할 수 없습니다 .
답변
이름에 액세스하고 이름을 할당하는 것은 다릅니다. 귀하의 경우, 당신은 단지 이름에 액세스하고 있습니다.
함수 내의 변수에 할당하면 전역 변수를 선언하지 않는 한 해당 변수는 로컬 인 것으로 간주됩니다. 그것이 없으면, 그것은 세계적인 것으로 가정됩니다.
>>> 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
답변
- 키워드없이 글로벌 키워드에 액세스 할 수 있습니다
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]
답변
함수 외부에서 선언 된 모든 변수는 전역 변수 인 것으로 가정되며, 변수 내부를 변수로 지정해야하는 함수 내부 (생성자 제외)에서 선언 할 때만 가능합니다.