파이썬에서 클래스변수가 계속 초기화 되는 이유가 궁금합니다.

조회수 1054회
class Stack:

    def __init__(self):
        self.items = []

    def __len__(self):
        return len(self.items)

    def is_empty(self):
        return len(self.items) == 0

    def push(self,e):
        self.items.append(e)

    def pop(self):
        if self.is_empty():
            raise Exception('Stack is empty')
        else:
            return self.items.pop()

    def top(self):
        if self.is_empty():
            raise Exception('Stack is empty')
        else:
            return self.items[-1]


valStack = Stack()
opStack = Stack()

def repeatOps(refOp):
    while ( len(valStack) > 1 or prec(refOp) <= prec(opStack.top()) ) :
        doOP()

def EvalExp( exp ):
    for e in exp:
        if e in '0123456789':
            valStack.push(e)
        else:
            if opStack.is_empty():
                opStack.push(e)
            else:
                repeatOps(e)
                opStack.push(e)
    repeatOps('+')
    print(valStack.top())

스택을 나타내는 클래스를 만들고 이것으로 전역 변수로 설정 함수에서 사용하는데 계속 초기화가 됩니다.

위의 소스가 일부분입니다. EvalExp 함수에서는 제대로 스택변수에 잘 쌓이는데 repeatOps함수의 opStack.top()에서 계속 스택이 비어있다고 뜹니다.

제가 객체지향이 처음이라 잘 모르는 건지는 모르겠는데 전역변수로 설정을 해도 불러 올때마다 초기화를 시키는 것이라 그런건지 잘 모르겠습니다. 어떻게 하면 초기화가 안되는지 궁금합니다.

위 코드는 스택을 이용한 계산기입니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 우선 위 프로그램을 보면 Stack class 만들고 valStack = Stack()를 통해 valStack이라는 instance를 만들었습니다. 현재 valStack instance에 있는 self.items라는 proptery는 empty입니다. 이후 EvalEXp를 실행하시는 것인지요? (참고로 function name을 python에서 소문자로 시작하는 것이 관례. 만약 repeatOps를 실행하면 아무런 결과가 없을 텐데요. self.items가 비어 있는 상태이니까요.

    프로그램 전체의 흐름을 이해하지 못해서 좋은 답변을 못드립니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)