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


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()에서 계속 스택이 비어있다고 뜹니다.

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

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

  • 2018년 04월 11일에 수정됨
    보통 회사원입니다. 파이썬과 장고를 좋아합니다.
  • 2018년 04월 10일에 작성됨

조회수 50


Banner nodejs

1 답변


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

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

  • 2018년 04월 15일에 작성됨
    교육자. 프로그래밍 비전공자. 취미로 파이썬 공부

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close