점프 투 파이썬(클래스와 전역, 지역변수 질문)
class A:
    def add1(self, a, b):
        self.a = a
        self.b = b
        self.r = 5
        return self.a + self.b + self.r

class B(A):

    def add2(self, a, c):
        self.a = a
        self.c = c
        k = 1/self.a
                s = 3

        p = A()


        def plus(m):
                                                              # <----------    global k  (추가)      
            k += 1 * s
            return m.add1(k, k) + self.c

        return self.c + plus(p)

n = B()
print(n.add2(2, 5))
>>  local variable 'k' referenced before assignment

클래스의 상속부분을 학습하기 위해 위와 같이 작성하였더니 오류가 발생하였습니다
[질문1]
1) local variable 'k' referenced before assignment오류발생
-> global k 추가
-> 2) name 'k' is not defined오류발생
1)을 해결하기 위해 global k를 추가 하였더니 2)의 오류가 발생하였습니다. 그런데
2)의 오류는 지역 변수 k를 만든 함수 안에서만 접근할 수 있고 바깥에서는 접근할 수 없다는 오류로 알고있는데
global k를 추가하였으므로 문제가 없을것 같은데 오류가 발생한 이유가 궁금하여 질문드립니다.

[질문2]
고민하던 중 아래와 같이 global k를 삭제하고 k대신 전부 self.k로 수정하면 올바른 값인 22가 출력됩니다.
이와 같이 하면 해결되는 이유가 궁금하여 질문드립니다

[질문3]
아래의 s=3의 경우 k와 같이 생각하면 s도 전역/지역변수 오류 등이 똑같이 발생하고 이를 위해 self.s = 3 형태로 쓰여야 할듯한데 k와는 달리 s=3으로 하여도 아무 문제없이 22가 출력됩니다 k와 s의 차이점이 무엇인지 질문드립니다

class A:
    def add1(self, a, b):
        self.a = a
        self.b = b
        self.r = 5
        return self.a + self.b + self.r

class B(A):

    def add2(self, a, c):
        self.a = a
        self.c = c
        self.k = 1/self.a
        s=3

        p = A()


        def plus(m):
            self.k += 1  * s
            return m.add1(self.k, self.k) + self.c

        return self.c + plus(p)

n = B()
print(n.add2(2, 5))

>>22

desk8203 228

M 2022년 9월 24일 11:39 오후

목록으로