[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라는 빈 목록을 받습니다!아직 익숙하지 않지만 숫자로 익숙해질 거야!
그럼, 다음에도 잘 부탁드립니다!
Reference
이 문제에 관하여([Python] 각 객체는 목록을 가져야 합니다(공유 안 함)?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hirochan/items/5934acec06d8453b0161텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)