Python 변 수 를 사용 할 때 피해 야 할 세 가지 오류
Python 프로 그래 밍 이 실 행 될 때 초보 자 들 이 실 수 를 하기 쉽 습 니 다.여 기 는 잠시 소개 하지 않 겠 습 니 다.자세 한 내용 은 다음 과 같 습 니 다.Python 이 실행 중인 17 개 시 초보 자 에 게 자주 발생 하 는 오류 소결
1.가 변 데이터 형식 은 함수 정의 의 기본 매개 변수 로 서
이게 맞 는 것 같은 데?현재 페이지 의 링크 를 검색 하고 다른 목록 에 추가 할 수 있 는 작은 함 수 를 썼 습 니 다.
def search_for_links(page, add_to=[]):
  new_links = page.search_for_links()
  add_to.extend(new_links)
  return add_to다음 코드 를 시도 해 보 세 요:
def fn(var1, var2=[]):
  var2.append(var1)
  print(var2)
fn(3)
fn(4)
fn(5)
[3]
[4]
[5]
[3]
[3,4]
[3,4,5]
fn(3,[4])
[4,3]
def fn(var1, var2=None):
  ifnot var2:
    var2 =[]
  var2.append(var1)
def search_for_links(page, add_to=None):
  ifnot add_to:
    add_to =[]
  new_links = page.search_for_links()
  add_to.extend(new_links)
  return add_to
def func(message="my message"):
  print(message)이것 은 위 에서 언급 한 마지막 실수 와 매우 비슷 하 다.다음 코드 를 생각 하 세 요:
class URLCatcher(object):
  urls =[]
  def add_url(self, url):
    self.urls.append(url)
a =URLCatcher()
a.add_url('http://www.google.com')
b =URLCatcher()
b.add_url('http://www.pythontab.com')
print(b.urls)
print(a.urls)
['http://www.google.com','http://www.pythontab.com']
['http://www.google.com','http://www.pythontab.com']이것 은 첫 번 째 오 례 와 같은 문제 다.클래스 정 의 를 만 들 때 URL 목록 이 실례 화 됩 니 다.이 종류의 모든 인 스 턴 스 는 같은 목록 을 사용 합 니 다.어떤 때 는 이런 상황 이 유용 하지만,대부분 너 는 이렇게 하고 싶 지 않다.너 는 모든 대상 에 게 하나의 단독 저장 이 있 기 를 바란다.이 를 위해,우 리 는 코드 를 다음 과 같이 수정 합 니 다.
class URLCatcher(object):
  def __init__(self):
    self.urls =[]
  def add_url(self, url):
    self.urls.append(url)3.가 변 적 인 분배 오류
이 문 제 는 나 를 한동안 괴 롭 혔 다.변 화 를 주 고 다른 가 변 데이터 형식 인 사전 을 사용 합 니 다.
a ={'1':"one",'2':'two'}
b = a
b['3']='three'이제 우리 가 바 꾸 고 싶 지 않 았 던 사전 a 를 봅 시다.
{'1':"one",'2':'two','3':'three'}
{'1':"one",'2':'two','3':'three'}
c =(2,3)
d = c
d =(4,5)이 함수 의 결 과 는 우리 가 예상 한 바 와 같다.그렇다면 이전의 예 에서 도대체 무슨 일이 일 어 났 을 까?가 변 형 태 를 사용 할 때 그 행동 은 C 언어의 지침 과 비슷 하 다.위의 코드 에서 우 리 는 b=a 를 명령 합 니 다.우리 가 진정 으로 표현 하 는 뜻 은 b 가 a 의 인용 이 된다 는 것 입 니 다.그것들 은 모두 Python 메모리 의 같은 대상 을 가리킨다.익숙 하 게 들 리 는데?그것 은 이 문제 가 이전 과 비슷 하기 때문이다.
리스트 도 같은 일이 일어 날 까요?예.그럼 어떻게 해결 할 까요?이것 은 반드시 매우 조심해 야 한다.만약 우리 가 정말 목록 을 복사 해서 처리 해 야 한다 면,우 리 는 이렇게 할 수 있다.
b = a[:]종이 에 목록 을 작성 한다 고 가정 하 세 요.기 존 예 에 서 는 A 씨 와 B 씨 가 같은 종 이 를 보고 있 었 던 셈 이다.만약 누군가가 이 명세 서 를 수정 했다 면,두 사람 은 모두 같은 변 화 를 보 게 될 것 이다.우리 가 인용 을 복사 할 때,모든 사람들 은 현재 자신 들 의 목록 을 가지 고 있다.그러나 우 리 는 이 리스트 에 음식 을 찾 는 곳 이 포함 된다 고 가정 한다.'냉장고'가 목록 의 첫 번 째 라면 복사 되 더 라 도 두 목록 의 항목 은 모두 같은 냉장 고 를 가리킨다.그래서 냉장고 가 A 에 의 해 수정 되 어 안에 있 는 큰 케이크 를 먹 으 면 B 도 이 케이크 가 사라 지 는 것 을 볼 수 있다.이곳 에는 그것 을 해결 할 간단 한 방법 이 없다.그것 을 기억 하고 코드 를 작성 할 때 이 문 제 를 일 으 키 지 않 는 방식 을 사용 하 세 요.
사전 은 같은 방식 으로 작업 하고 다음 과 같은 방식 으로 비 싼 사본 을 만 들 수 있 습 니 다.
b = a.copy()가 변 데이터 형식의 번 거 로 움 도 강력 한 곳 이다.이상 은 모두 실제 문제 가 아니다.그것들 은 발생 하지 않도록 주의해 야 할 문제 들이다.세 번 째 항목 에서 비 싼 복제 작업 을 해결 방안 으로 사용 하 는 것 은 99%일 때 불필요 하 다.
총결산
이상 은 Python 변 수 를 사용 할 때 피해 야 할 세 가지 잘못된 모든 내용 입 니 다.도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사 이 트 를 계속 참조 할 수 있 습 니 다.python 탐색 의 BaseHTTPServer-웹 서버 구현 소개,Python 탐색 의 SocketServer 상세 설명등 부족 한 점 이 있 으 면 댓 글 에 지적 해 주 십시오.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.