Python 변 수 를 사용 할 때 피해 야 할 세 가지 오류

6116 단어 python변량
Python 프로 그래 밍 에서 알 수 없 는 오류 가 자주 발생 합 니 다.사실 이것 은 언어 자체 의 문제 가 아니 라 언어 자체 의 일부 특성 을 무시 해서 생 긴 것 입 니 다.오늘 은 Python 변 수 를 사용 할 때 발생 하 는 3 가지 불가사의 한 오 류 를 살 펴 보 겠 습 니 다.앞으로 프로 그래 밍 에서 주의해 야 합 니 다.
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
겉으로 볼 때 이것 은 매우 정상 적 인 Python 코드 인 것 같 지만 사실은 그것 도 그 렇 고 실행 할 수 있다.그런데 여기 문제 가 있어 요.하면,만약,만약...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]
왜 일 까요?보시 다시 피 매번 같은 목록 을 사용 합 니 다.출력 은 왜 이 렇 습 니까?Python 에서 우리 가 이러한 함 수 를 만 들 때 이 목록 은 함수 정의 의 일부분 으로 예화 되 었 습 니 다.함수 가 실 행 될 때,그것 은 매번 실례 화 되 는 것 이 아니다.이것 은 우리 가 새로운 대상 을 제공 하지 않 는 한 이 함수 가 똑 같은 목록 대상 을 계속 사용 한 다 는 것 을 의미한다.

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)
2.가 변 데이터 형식 을 클래스 변수 로 한다.
이것 은 위 에서 언급 한 마지막 실수 와 매우 비슷 하 다.다음 코드 를 생각 하 세 요:

class URLCatcher(object):
  urls =[]
  def add_url(self, url):
    self.urls.append(url)
이 코드 는 보기에 매우 정상적이다.우 리 는 URL 을 저장 할 대상 이 있다.우리 가 add 를 호출 할 때url 방법 은 주어진 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']
잠깐 만,어떻게 된 거 야?!우리 가 생각 하 는 건 그게 아니 잖 아.우 리 는 두 개의 단독 대상 a 와 b 를 예화 했다.하나의 URL 을 a 에 게 주 었 고,다른 하 나 는 b 에 게 주 었 다.이 두 대상 이 어떻게 모두 이 두 개의 URL 을 가지 고 있 습 니까?
이것 은 첫 번 째 오 례 와 같은 문제 다.클래스 정 의 를 만 들 때 URL 목록 이 실례 화 됩 니 다.이 종류의 모든 인 스 턴 스 는 같은 목록 을 사용 합 니 다.어떤 때 는 이런 상황 이 유용 하지만,대부분 너 는 이렇게 하고 싶 지 않다.너 는 모든 대상 에 게 하나의 단독 저장 이 있 기 를 바란다.이 를 위해,우 리 는 코드 를 다음 과 같이 수정 합 니 다.

class URLCatcher(object):
  def __init__(self):
    self.urls =[]
  def add_url(self, url):
    self.urls.append(url)
현재 대상 을 만 들 때 URL 목록 이 실례 화 됩 니 다.우리 가 두 개의 단독 대상 을 예화 할 때,그것들 은 각각 두 개의 단독 목록 을 사용 할 것 이다.
3.가 변 적 인 분배 오류
이 문 제 는 나 를 한동안 괴 롭 혔 다.변 화 를 주 고 다른 가 변 데이터 형식 인 사전 을 사용 합 니 다.

a ={'1':"one",'2':'two'}
지금 우리 가 이 사전 을 다른 곳 에 사용 하고 초기 데 이 터 를 완전 하 게 유지 하고 싶다 고 가정 하 자.

b = a
b['3']='three'
쉽 죠?
이제 우리 가 바 꾸 고 싶 지 않 았 던 사전 a 를 봅 시다.

{'1':"one",'2':'two','3':'three'}
와,잠깐 만,우리 b 다시 볼 까?

{'1':"one",'2':'two','3':'three'}
잠깐 만,뭐라고?좀 복잡 합 니 다............................................................................

c =(2,3)
d = c
d =(4,5)
현재 c 는(2,3)이 고 d 는(4,5)입 니 다.
이 함수 의 결 과 는 우리 가 예상 한 바 와 같다.그렇다면 이전의 예 에서 도대체 무슨 일이 일 어 났 을 까?가 변 형 태 를 사용 할 때 그 행동 은 C 언어의 지침 과 비슷 하 다.위의 코드 에서 우 리 는 b=a 를 명령 합 니 다.우리 가 진정 으로 표현 하 는 뜻 은 b 가 a 의 인용 이 된다 는 것 입 니 다.그것들 은 모두 Python 메모리 의 같은 대상 을 가리킨다.익숙 하 게 들 리 는데?그것 은 이 문제 가 이전 과 비슷 하기 때문이다.
리스트 도 같은 일이 일어 날 까요?예.그럼 어떻게 해결 할 까요?이것 은 반드시 매우 조심해 야 한다.만약 우리 가 정말 목록 을 복사 해서 처리 해 야 한다 면,우 리 는 이렇게 할 수 있다.

b = a[:]
목록 에 있 는 모든 대상 의 인용 을 옮 겨 다 니 며 복사 하고 새 목록 에 넣 습 니 다.그러나 주의:목록 의 모든 대상 이 가 변 적 이 라면 완전한 복사 본 이 아 닌 인용 을 다시 얻 을 수 있 습 니 다.
종이 에 목록 을 작성 한다 고 가정 하 세 요.기 존 예 에 서 는 A 씨 와 B 씨 가 같은 종 이 를 보고 있 었 던 셈 이다.만약 누군가가 이 명세 서 를 수정 했다 면,두 사람 은 모두 같은 변 화 를 보 게 될 것 이다.우리 가 인용 을 복사 할 때,모든 사람들 은 현재 자신 들 의 목록 을 가지 고 있다.그러나 우 리 는 이 리스트 에 음식 을 찾 는 곳 이 포함 된다 고 가정 한다.'냉장고'가 목록 의 첫 번 째 라면 복사 되 더 라 도 두 목록 의 항목 은 모두 같은 냉장 고 를 가리킨다.그래서 냉장고 가 A 에 의 해 수정 되 어 안에 있 는 큰 케이크 를 먹 으 면 B 도 이 케이크 가 사라 지 는 것 을 볼 수 있다.이곳 에는 그것 을 해결 할 간단 한 방법 이 없다.그것 을 기억 하고 코드 를 작성 할 때 이 문 제 를 일 으 키 지 않 는 방식 을 사용 하 세 요.
사전 은 같은 방식 으로 작업 하고 다음 과 같은 방식 으로 비 싼 사본 을 만 들 수 있 습 니 다.

b = a.copy()
다시 한 번 설명 하 자 면,이것 은 원래 존재 하 는 동일 한 항목 을 가리 키 는 새로운 사전 을 만 들 뿐이다.따라서 같은 목록 이 두 개 있 고 사전 a 의 키 가 가리 키 는 가 변 대상 을 수정 하면 사전 b 에서 도 이러한 변 화 를 볼 수 있 습 니 다.
가 변 데이터 형식의 번 거 로 움 도 강력 한 곳 이다.이상 은 모두 실제 문제 가 아니다.그것들 은 발생 하지 않도록 주의해 야 할 문제 들이다.세 번 째 항목 에서 비 싼 복제 작업 을 해결 방안 으로 사용 하 는 것 은 99%일 때 불필요 하 다.
총결산
이상 은 Python 변 수 를 사용 할 때 피해 야 할 세 가지 잘못된 모든 내용 입 니 다.도움 이 되 기 를 바 랍 니 다.관심 이 있 는 친 구 는 본 사 이 트 를 계속 참조 할 수 있 습 니 다.python 탐색 의 BaseHTTPServer-웹 서버 구현 소개,Python 탐색 의 SocketServer 상세 설명등 부족 한 점 이 있 으 면 댓 글 에 지적 해 주 십시오.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기