def StackPush(val):
stack.append(val)
print("Push : ", stack)
if(len(stack) == 1):
ptr3 = [val, 0, 0]
elif(len(stack) == 2):
ptr3 = [stack[0], val, 0]
elif(len(stack) == 3):
ptr3 = [stack[0], stack[1], val]
else:
ptr3 = [stack[len(stack) - 3], stack[len(stack) - 2], stack[len(stack) - 1]]
def StackPop():
del stack[len(stack) - 1]
del stack[len(stack) - 1]
del stack[len(stack) - 1]
print("Pop : ", stack)
if(len(stack) == 0):
ptr3 = [0,0,0]
elif(len(stack) == 1):
ptr3 = [stack[0], 0, 0]
elif(len(stack) == 2):
ptr3 = [stack[0], stack[1], 0]
else:
ptr3 = [stack[len(stack) - 3], stack[len(stack) - 2], stack[len(stack) - 1]]
def solution(ingredient):
answer = 0
global stack
stack = []
global ptr3
ptr3 = [0,0,0]
for ing in ingredient:
print("ptr3 : ", ptr3)
if(ing == 1 and (ptr3 == [1,2,3])):
StackPop()
answer += 1
else:
StackPush(ing)
return answer
이렇게 작성했는데 ptr3에는 반복문을 계속 해도 무조건 [0, 0, 0]만 찍힙니다. 왜 이런 걸까요?
전역 변수를 사용하려면 사용하는 변수명이 전역 변수인지를 명시해야 합니다. 전역 변수와 같은 이름의 지역 변수의 사용이 가능하다는 걸 알고 계실 겁니다. 그러면 단순히 변수명만 있을 때 그게 전역 변수인지 지역 변수인지 알 수 없습니다. 그런 경우 기본적으로 그 변수명을 지역 변수로 인식하게 됩니다. 그 쪽이 오류가 일어난다고 해도 해당 지역 변수가 있는 함수에서만 문제가 될 테니까요.
global ptr3 구문을 solution 함수 안에 넣었기 때문에 ptr3는 모든 부분에서 전역변수로 인지하지 않나요?
한 번 전역 변수가 선언된 함수가 아닌 다른 함수에서 그 전역 변수의 값을 변경시키고 출력해 보세요. 그러니까
def Solution(ingredient):
global a
a = 1
pri()
print(a)
def Pri() :
a = 2
print(a)
이걸 돌려 보세요. 만약 그냥 같은 변수명으로 선언만 해도 전역 변수로 인정이 된다면 출력 되는 2번의 a의 값이 모두 2가 되겠죠.
2뜨고 1로 뜨네요. C언어 하다가 파이썬 하니까 조금 헷갈립니다. C언어에서는 하나의 c 확장자 파일이 전역변수의 범위였는데, 파이썬에서는 정확히 global의 범위가 어디까지인지 궁금합니다.
범위는 똑같을 겁니다. 단지 전역 변수라고 인식을 하지 못하고 지역 변수라고 인식을 하는 것 뿐입니다. 그냥 파이썬의 전역 변수에 대해서 찾아보면 원하는 답을 얻을 수 있지 않을까 싶습니다.