강의로 돌아가기

[파이썬] [코드있음 주의] global(전역변수)변수에 대입이 안 됩니다.

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]만 찍힙니다. 왜 이런 걸까요?

3 개의 답변
낙방여우

전역 변수를 사용하려면 사용하는 변수명이 전역 변수인지를 명시해야 합니다. 전역 변수와 같은 이름의 지역 변수의 사용이 가능하다는 걸 알고 계실 겁니다. 그러면 단순히 변수명만 있을 때 그게 전역 변수인지 지역 변수인지 알 수 없습니다. 그런 경우 기본적으로 그 변수명을 지역 변수로 인식하게 됩니다. 그 쪽이 오류가 일어난다고 해도 해당 지역 변수가 있는 함수에서만 문제가 될 테니까요.

  • global ptr3 구문을 solution 함수 안에 넣었기 때문에 ptr3는 모든 부분에서 전역변수로 인지하지 않나요?

    탈퇴한 사용자―2023.10.16 11:06
낙방여우

한 번 전역 변수가 선언된 함수가 아닌 다른 함수에서 그 전역 변수의 값을 변경시키고 출력해 보세요. 그러니까

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의 범위가 어디까지인지 궁금합니다.

    탈퇴한 사용자―2023.10.16 14:50
낙방여우

범위는 똑같을 겁니다. 단지 전역 변수라고 인식을 하지 못하고 지역 변수라고 인식을 하는 것 뿐입니다. 그냥 파이썬의 전역 변수에 대해서 찾아보면 원하는 답을 얻을 수 있지 않을까 싶습니다.

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.