파이썬 변수는 유형이 없으며 객체에 대한 참조 일뿐입니다. 참조의 크기는 참조하는 내용과 관계없이 동일합니다.파이썬의 C 구현에서 그것은 포인터이고, 은에 타입이 있습니다. 파이썬 객체에 대한 포인터는 PyObject *
입니다. 포인터는 객체 클래스에 관계없이 같은 유형입니다. 반면에 객체는 어느 클래스에 속하는지 알 수 있습니다.
파이썬에는 변수가 없으며 대부분의 사람들에게 너무 먼 단계입니다.
CPython 구현의 참조에는 실제로 가상 주소 인 ID (식별자)가 있습니다. 이 주소의 세부 사항 및 가치는 추구할만한 가치가 없습니다. 버전간에 변경 될 수 있으며 (아마도 가능할 것입니다) 객체를 식별하는 고유 번호 이외의 다른 용도로 사용되지 않습니다. 무슨 일이 일어나고 있는지 그럼에도 불구하고 흥미 포인터를 (잘났어) 제공 할 수 x
및 y
의 ID (주소)가 동일한 지
가
>>> x = 42
>>> y = x
>>> id(x)
4297539264
>>> id(y)
4297539264
주 -가 같은 객체를 참조하고이 값과 int
을 따라서 우리가 x
을 변경할 때 y
도 변경됩니까?
>>> x = "hello"
>>> id(x)
4324832176
>>> id(y)
4297539264
고맙게도. 이제 x
은 값이 "Hello"인 클래스 str
의 새 객체를 나타냅니다.
>>> id(y)
4297539264
>>> y = 37
>>> id(y)
4297539104
y
의 ID가 변경 : 우리가
! 이것은 이제 다른 객체를 참조하기 때문입니다. int
은 이 아니며 임으로 할당 y = 37
은 원래 오브젝트 (42)를 새로 변경하지 않았습니다. 값이 42 인 객체는 참조 카운트가 감소하고 이제 (이론적으로) 삭제 될 수 있습니다. 실제로는 효율성상의 이유로 메모리에 남아 있지만 구현 세부 사항은 그대로 유지됩니다. 그러나
:
>>> a = [1,2,3,4]
>>> b = a
>>> id(a)
4324804808
>>> id(b)
4324804808
>>> a[0] = 99
>>> b
[99, 2, 3, 4]
그래서
a
이이
b
을 변경 목록을 변경! 이는 목록이
이로 변경 될 수 있기 때문에 변경 될 수 있습니다. 할당
b = a
은 목록이 아닌 참조 만 복사했습니다. 표준 라이브러리의
copy을 참조하십시오.
@GreenAsJade : OP는 파이썬 3을 사용합니다. 여기서'type' 객체의 표현은''type''이 아닌''class''를 사용합니다; 이것은 C 정의 된 유형이 클래스 일 뿐이라는 것을 반영하기 위해 수행되었습니다. –
@MartijnPieters에는 python3 태그가 필요할 수 있습니다. – GreenAsJade
@GreenAsJade : 아니요, 대답은 파이썬 2와 3에서 동일합니다. 그러나 제공된 결과물은 수정할 필요가 없습니다. –