작성
·
52
답변 2
1
global 없이도 잘 동작하는 경우가 있다?
네, 이건 두 가지 이유 중 하나 때문입니다:
① 이미 global이 코드에 명시되어 있다
→ 예제 소스코드상에 global numUsed가 Producer와 Consumer 둘 다에 들어 있습니다.
global numUsed
위의 코드가 이미 선언되어 있음
그래서 당연히 에러 없이 잘 동작합니다.
만약 이걸 빼면 어떻게 될까요?
② global을 빼면 실제로 에러가 발생한다
예를 들어 아래처럼 Producer에서 global numUsed를 뺐다고 가정하면:
class Producer(QThread):
def run(self):
for i in range(10):
time.sleep(1)
mutex.lock()
numUsed += 1 # ⚠ 여기가 에러 발생
incNumber.wakeAll()
mutex.unlock()
실행하면 아래와 같은 에러가 뜹니다:
UnboundLocalError: cannot access local variable 'numUsed' where it is not associated with a value
즉, 정상적인 Python 동작에서는 반드시 global numUsed가 필요합니다.
혹시 더 궁금한게 있으면 언제든 질문해 주세요.
감사합니다. 김대진 드림.
1
안녕하세요, 인프런 AI 인턴입니다. padohy님.
Qt 관련 강의를 수강하시면서 쓰레드 및 동기화 문제와 관련하여 궁금한 점이 있으시군요. mutex
와 incNumber
가 전역 변수로 선언되지 않았는데도 올바르게 작동하는 이유에 대해 설명드리겠습니다.
Python에서 변수를 전역적으로 사용하고자 할 때 global
키워드를 사용하는데, 이는 함수 내에서 전역 변수를 수정할 필요가 있을 때 주로 사용됩니다. 그러나 mutex
와 incNumber
의 경우, 일반적으로 해당 변수가 함수 바깥에서 이미 정의된 상태라면, 읽기 전용으로 사용할 때 global
키워드를 사용하지 않아도 됩니다.
Global 변수 접근: 어떤 변수든 함수 밖에서 초기화되고 읽기만 하는 경우에는 자동으로 그 변수를 가져와서 사용할 수 있습니다. 즉, 읽기 전용으로 변수를 사용하는 경우에는 global
키워드가 필요하지 않습니다.
Global 변수 수정: 반면, 함수 내에서 전역 변수를 수정해야 할 경우에만 global
키워드가 필요합니다. 만약 함수 내에서 mutex
나 incNumber
를 수정하고 있다면, 이 경우에 global
을 명시해야 합니다.
관련 내용의 예시나 코드 포맷에 대한 설명은 Qt 프로그래밍 환경을 설정할 때 공통으로 나타날 수 있는 상황입니다.
유사한 질문과 관련된 이전 답변들이 도움이 될 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.