2014-01-13 4 views
2

두 개의 개별적으로 작성된 변경 가능 목록에는 다른 ID가 있습니다.두 개의 개별적으로 생성 된 불변 개체가 동일한 id 및 변경 가능한 개체를 갖는 이유는 둘 다 서로 다른 값을 참조하는 이유는 무엇입니까?

파이썬 SHELL : (변경 가능)

>>> mylist = ['spam', 'eggs'] 
>>> yourlist = ['spam', 'eggs'] 
>>> id(mylist), id(yourlist) 
(49624456, 48910408) 

이 개별적으로 만들어 불변의 문자열이 유사한 ID를 가지고 있지만.

파이썬 SHELL : (불변)

>>> a = 10 
>>> b = 10 
>>> id(a), id(b) 
(507099072, 507099072) 

가 같은 객체를 참조 ab인가? 없다면 왜 ID가 비슷한가? mylistyourlist이 다른 객체를 참조합니까? 그렇다면 다른 ID를 사용하는 이유는 무엇입니까?

+0

변경 가능한 개체가 이러한 이유로 변형 될 수 있으므로 목록이 두 번 생성되지만 두 목록의 요소 0의 ID를 확인하면 동일해야합니다. 리스트가 변경 가능하기 때문에리스트 내의 모든 "셀"이 같은 "불변"객체를 가리키더라도 list가 동일한 객체를 가리 키도록 기대할 수는 없습니다. 변경할 수없는 객체는 그 이유 때문에 변형 될 수 없으며, 파이썬은이를 최적화하여 중복을 방지 할 수 있습니다. –

답변

3

파이썬은 몇 가지 작은 문자열과 숫자 캐시 : 당신은 그 범위의 int를 만들 때 http://docs.python.org/2/c-api/int.html#PyInt_FromLong

가 현재의 구현은, -5 256 사이의 모든 정수에 대한 정수 객체의 배열을 유지 당신 실제로 단지 기존 객체에 대한 참조를 되 찾을 수 있습니다. 메모리에 목록이 아닌 문자열 목록 개체 -

그리고 id(some_list)는 항상 당신에게 컨테이너의 주소를 제공합니다!

+0

-5와 256 사이의 값이 같은 두 개의 변수를 만드는 방법이 있지만 서로 다른 객체로 설정하는 방법이 있습니까? 'a = 2','b = 2' 그리고'a is b'는'True'를 리턴합니다. 두 값을 모두 가질 수 있지만 다른 개체가 될 수있는 방법이 있습니까? –

+0

@JesseZhuang 나는 서브 클래 싱을 int로 - 단 한 가지 방법을 참조하십시오. 자신의 정수 클래스의 모든 인스턴스는 다른 개체가 될 것입니다 ... – ndpu