[Python] 각 객체는 목록을 가져야 합니다(공유 안 함)?

8127 단어 초보자Python
파이썬의 초보자입니다!
어떤 교재의 코드 과제를 해결하는 것은 이해하기 어려워 기사를 쓰기로 했다.
나는 지금 이해할 수 있는 용어와 지식으로 언어화하려고 노력했다.
설명에서 이상한 점과 이해가 얕은 부분이 있다면 엔지니어들이 지적해 주시기 바랍니다>(2021-01-22@shiracamus 선생님께서 가르쳐 주셨어요. 제가 보충할게요!감사합니다 m(__)m)

사용 환경


macOS BigSur 버전 11.1
Google Colaboratory

도전하다


그래서 바로 그 과제다.
Q. 다음 반에 오류가 있습니다.
여러 개의 실례를 진행하는 상황에서add 방법을 호출할 때 각 대상에 목록을 공유합니다.
너는 이 디버깅을 해서 그것을 정상적으로 운행하게 해라.
class Sample:
    li = []
    def __init__(self, name):
        self.name = name

    def add(self, name):
        self.li.append(name)

a = Sample('test1')
b = Sample('test2')
a.add('test1 a')
b.add('test2 b')

print(a.li) 

# 出力結果
# ['test1 a', 'test2 b']

원인


나 이거 어떻게 해야 되지?
먼저 출력 결과를 보면 문제문에서 보듯이 출력은 ['test1 a', 'test2 b']이다.
원래 어떤 출력을 기대하고 있다면 코드print(a.li)를 보면 출력['test1 a']만 하고 싶은 것으로 추정된다.
이런 일이 발생한 원인이 어디에 있는지 말하자면 a.add('test1 a')b.add('test2 b') 모두 같은 목록li = []을 사용했기 때문이라고 볼 수 있다.
그럼 왜 같은 리스트를 사용했나요?
이것은 구조 함수 외에 변수를 묘사했기 때문이다. (= 실례 변수가 아니라 클래스 변수이다.)
이 점을 이해하는 데 필요한 세 가지 지식을 총결하다.
(이 세 가지는 잘 이해가 안 되는데...)

중요 사항


① 구조 함수


구조 함수는 실례를 생성할 때 자동으로 호출되는 방법으로 필요한 종류의 실례를 초기화하는 데 사용된다.
※ 엄밀히 말하면'구조 함수에서 호출된 초기화 방법'이 정확합니다.
구조 함수는 「__init__」 에서 정의됩니다.그리고 클래스의 함수의 첫 번째 매개 변수는 「self」 로 지정됩니다.
각 실례를 생성할 때 각자의 데이터를 가지고 싶어서 초기화하면 된다.

② 인스턴스 변수


(2021-01-22@shiracamus 선생님께서 가르쳐 주셨어요. 제가 보충할게요!감사합니다 m(__)m)
그리고 이를 실시할 때 또 다른 중요한 개념은 방법적으로 정의된 변수를 실례 변수라고 한다.
인스턴스 변수는 각 인스턴스(객체)에 독립적인 특성을 가집니다.
그리고 규칙은 이 실례 변수에self(실례 자체)를 추가합니다.
기본적인 작법은 다음과 같다.

def __init__(self, 引数):
  self.インスタンス変数 = 引数
따라서 구조 함수에서 실례 변수를 정의하려면 self.li = [] 로 쓰는 것이 가장 좋다.

③ 클래스 변수


클래스 변수는 처음에 쓴 바와 같이class 바로 아래에 정의된 변수입니다.
또한 이 변수는 모든 실례에서 공유되는 성질을 가지고 있다.
그래서 최초의 코드에서 목록은 a, b의 모든 실례에 의해 공유되었다!그렇군요
② 요약 ③
1. 변수를 실례에 대입할 때 실례에서 변수를 생성합니다(클래스 변수와 다름).
2. 인스턴스에 변수를 대입하지 않으면 참조 클래스 변수
듣자니 이 부근은 헷갈리기 쉽다고 하던데, 아래의 보도도 참고로 하겠습니다!
@7shi감사합니다
Python에서 클래스 변수와 실례 변수를 잘못했습니다.

해결 방법


따라서 이상의 일을 억제하면 코드를 써 보세요.
class Sample:
    def __init__(self, name):
        self.name = name
        self.li = []

    def add(self, name):
        self.li.append(name)

a = Sample('test1')
b = Sample('test2')
a.add('test1 a')
b.add('test2 b')
a.add('test3 a')
b.add('test4 b')

print(a.li)
print(b.li)

## 出力結果
## ['test1 a', 'test3 a']
## ['test2 b', 'test4 b']

출력 결과도 각 실례에 대한 목록 생성__init__에서 실례 변수를 만들면 모든 실례(a와 b)는 초기화된 li라는 빈 목록을 받습니다!
아직 익숙하지 않지만 숫자로 익숙해질 거야!
그럼, 다음에도 잘 부탁드립니다!

좋은 웹페이지 즐겨찾기