python 의 클래스 변수 와 구성원 변수의 사용 주의 점 요약

머리말
최근 에 python 으로 프로젝트 를 쓰 고 있 는데 징 그 러 운 bug 를 발 견 했 습 니 다.바로 같은 클래스 에서 생 성 된 두 개의 인 스 턴 스 간 의 데이터 가 서로 영향 을 미 치 는 것 을 알 게 되 었 습 니 다.이것 은 저 를 매우 이해 하지 못 하 게 합 니 다.나중에 자바 의 클래스 에 클래스 변수 도 있 고 인 스 턴 스 변수 도 있다 는 것 을 연 상 했 기 때문에 관련 자 료 를 뒤 져 보 니 python 에 도 유사 한 클래스 변수 와 인 스 턴 스 변수 가 있 는 것 을 발견 했다.다음은 상세 한 소 개 를 살 펴 보 자.
다음 예제 코드 를 보십시오.

class A:
 x = 0
 def __init__(self):
 self.y = 0
x 는 클래스 변수 이 고 y 는 인 스 턴 스 변수 입 니 다.
원칙적으로 틀 리 지 않 았 지만 실제로 사용 할 때 징 그 러 운 문제 들 을 발견 했다.예 를 들 어 다음 코드:

class A:
 x = []
 y = 0
 def __init__(self):
 pass
 def add(self):
 self.x.append('1')
 self.y+=1
a=A() 
print a.x,a.y
print A.x,A.y
a.add()
print a.x,a.y
print A.x,A.y
b=A() 
print b.x,b.y
print A.x,A.y
여기 서 x 와 y 는 모두 클래스 변수 이 고 add 의 역할 은 각각 x 와 y 를 수정 하 는 것 이 분명 하 다.그 다음 에 인 스 턴 스 a 를 구성 하여 인 스 턴 스 a 의 값 을 수정 하고 마지막 으로 인 스 턴 스 b 를 구성 합 니 다.
이 결 과 는 뻔 하 다 고 생각 했 지만 그 가 내 놓 은 결 과 는:

[] 0
[] 0
['1'] 1
['1'] 0
['1'] 0
['1'] 0
문 제 는 어디 에 있 습 니까?분명히 x 와 y 는 모두 클래스 변수 인 데 두 번 째 print 에서 왜 a.x 는 b.x 와 같 지만 a.y 와 b.y 는 다 릅 니까?
한참 을 생각 하 다가 이 치 를 깨 달 았 다.바로 python 에 있어 서 클래스 변 수 는 모든 클래스 가 공유 하 는 것 입 니 다.그러나 그것 은 우리 가 사용 하 는 똑 같은 인용 상황 에서 예 를 들 어[]대상 에 대한 append 방법 은 바로 공용 변수 이다.그러나 할당 문 에 있어 서 클래스 에서 클래스 변수 에 할당 문 구 를 사용 하면 python 은 이 대상 의 사본 을 생 성 할 것 입 니 다.앞으로 의 작업 은 모두 이 사본 을 바탕 으로 원래 의 클래스 대상 에 영향 을 주지 않 습 니 다.이렇게 하면 상부 의 현상 을 설명 할 수 있다.
그러면 클래스 변수 와 인 스 턴 스 변수의 차 이 를 잊 어 버 리 지 않도록 공용 변 수 를 사용 하고 싶 지 않 을 때 변 수 를 사용 하 는 것 이 가장 좋 은 방법 입 니 다.각 클래스 에서 변 수 를 사용 할 때 다시 초기 화 하 는 것 이 의외 의 사고 가 발생 하지 않도록 하 는 것 입 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기