[PYTHON] id () 함수는 무엇을 위해 사용됩니까?
PYTHONid () 함수는 무엇을 위해 사용됩니까?
나는 파이썬 2 문서를 읽고 id () 함수를 발견했다.
그래서, 나는 목록과 함께 id ()를 사용하여 실험했다.
>>> list = [1,2,3]
>>> id(list[0])
31186196
>>> id(list[1])
31907092 // increased by 896
>>> id(list[2])
31907080 // decreased by 12
함수에서 반환 된 정수는 무엇입니까? C의 메모리 주소와 동의어입니까? 그렇다면 정수가 데이터 유형의 크기와 일치하지 않는 이유는 무엇입니까?
실제로 id ()는 사용됩니까?
해결법
-
==============================
1.게시물에 몇 가지 질문이 있습니다.
게시물에 몇 가지 질문이 있습니다.
그것은 "정수 (또는 긴 정수)가 유일하고 그 개체의 수명 동안 상수가 보장됩니다." (파이썬 표준 라이브러리 - 내장 함수) 고유 번호. 더 이상 아무것도, 덜 아무것도. 이것을 파이썬 객체의 사회 보장 번호 또는 직원 ID 번호라고 생각하십시오.
개념적으로 그렇습니다. 평생 동안 우주에서 유일무이하다는 것을 보장합니다. 그리고 Python의 특정 구현에서 실제로는 해당 C 객체의 메모리 주소입니다.
목록은 배열이 아니므로 목록 요소는 참조가 아니라 객체입니다.
거의. id () (또는 이와 동등한)가 is 연산자에서 사용됩니다.
-
==============================
2.그것은 기억 속에있는 물체의 위치의 정체성입니다 ...
그것은 기억 속에있는 물체의 위치의 정체성입니다 ...
이 예제는 개념을 조금 더 이해하는 데 도움이 될 수 있습니다.
foo = 1 bar = foo baz = bar fii = 1 print id(foo) print id(bar) print id(baz) print id(fii) > 1532352 > 1532352 > 1532352 > 1532352
이것들은 모두 메모리의 동일한 위치를 가리키며, 그 이유는 값이 동일하기 때문입니다. 예제에서 1은 한 번만 저장되고 1을 가리키는 다른 것은 해당 메모리 위치를 참조합니다.
-
==============================
3.id ()는 (CPython에서) 참조되는 객체의 주소를 반환하지만, 파이썬리스트는 C 배열과 매우 다르다는 사실에 혼란이있다. 파이썬 목록에서 모든 요소는 참조입니다. 그래서 당신이하고있는 것은이 C 코드와 훨씬 더 유사합니다 :
id ()는 (CPython에서) 참조되는 객체의 주소를 반환하지만, 파이썬리스트는 C 배열과 매우 다르다는 사실에 혼란이있다. 파이썬 목록에서 모든 요소는 참조입니다. 그래서 당신이하고있는 것은이 C 코드와 훨씬 더 유사합니다 :
int *arr[3]; arr[0] = malloc(sizeof(int)); *arr[0] = 1; arr[1] = malloc(sizeof(int)); *arr[1] = 2; arr[2] = malloc(sizeof(int)); *arr[2] = 3; printf("%p %p %p", arr[0], arr[1], arr[2]);
즉, 참조에서 주소를 인쇄하고 목록이 저장된 위치와 관련된 주소는 인쇄하지 않습니다.
제 경우에는 id () 함수를 사용하여 C에서 Python을 호출 할 때 C 코드로 돌아가는 불투명 한 핸들을 생성하는 데 편리합니다. 그렇게하면 사전을 사용하여 핸들에서 오브젝트를 쉽게 찾을 수 있고 그 핸들이 보장됩니다. 독특한.
-
==============================
4.나는 Python으로 시작하고 있으며, 대화 형 쉘을 사용하여 내 변수가 동일한 변수에 할당되었는지 또는 동일한 변수인지 여부를 확인하기 위해 ID를 사용합니다.
나는 Python으로 시작하고 있으며, 대화 형 쉘을 사용하여 내 변수가 동일한 변수에 할당되었는지 또는 동일한 변수인지 여부를 확인하기 위해 ID를 사용합니다.
모든 값은 컴퓨터의 메모리에 저장되는 위치와 관련된 고유 번호 인 ID입니다.
-
==============================
5.롭의 대답 (위에 뽑힌 것)은 정확합니다. ID를 사용하는 일부 상황에서는 객체를 비교하고 객체를 참조하는 객체를 찾을 수 있으므로 유용하다고 덧붙이고 싶습니다.
롭의 대답 (위에 뽑힌 것)은 정확합니다. ID를 사용하는 일부 상황에서는 객체를 비교하고 객체를 참조하는 객체를 찾을 수 있으므로 유용하다고 덧붙이고 싶습니다.
나중에 대개는 변경 가능한 객체가 매개 변수로 전달되어 클래스를 호출하고 클래스의 로컬 변수에 할당되는 이상한 버그를 디버그하는 데 도움이됩니다. 그 물체를 돌연변이 시키면 클래스에서 바스 (vars)가 변이됩니다. 이것은 여러 가지가 동시에 변하는 이상한 행동으로 나타납니다.
최근에 파이썬 / Tkinter 응용 프로그램에서이 문제가 발생했습니다.이 응용 프로그램에서는 한 텍스트 입력 필드의 텍스트를 편집 할 때 입력 한 텍스트를 다른 텍스트로 변경했습니다. :)
다음은 함수 id ()를 사용하여 참조가있는 위치를 추적하는 방법에 대한 예제입니다. 꼭 모든 가능한 경우를 다루는 해결책은 아니지만 아이디어를 얻을 수 있습니다. 다시 ID는 백그라운드에서 사용되며 사용자는 표시하지 않습니다.
class democlass: classvar = 24 def __init__(self, var): self.instancevar1 = var self.instancevar2 = 42 def whoreferencesmylocalvars(self, fromwhere): return {__l__: {__g__ for __g__ in fromwhere if not callable(__g__) and id(eval(__g__)) == id(getattr(self,__l__)) } for __l__ in dir(self) if not callable(getattr(self, __l__)) and __l__[-1] != '_' } def whoreferencesthisclassinstance(self, fromwhere): return {__g__ for __g__ in fromwhere if not callable(__g__) and id(eval(__g__)) == id(self) } a = [1,2,3,4] b = a c = b democlassinstance = democlass(a) d = democlassinstance e = d f = democlassinstance.classvar g = democlassinstance.instancevar2 print( 'My class instance is of', type(democlassinstance), 'type.') print( 'My instance vars are referenced by:', democlassinstance.whoreferencesmylocalvars(globals()) ) print( 'My class instance is referenced by:', democlassinstance.whoreferencesthisclassinstance(globals()) )
산출:
My class instance is of <class '__main__.democlass'> type. My instance vars are referenced by: {'instancevar2': {'g'}, 'classvar': {'f'}, 'instancevar1': {'a', 'c', 'b'}} My class instance is referenced by: {'e', 'd', 'democlassinstance'}
변수 이름의 밑줄은 이름 정렬을 방지하는 데 사용됩니다. 함수는 "fromwhere"인수를 사용하여 참조 검색을 시작할 위치를 알려줄 수 있습니다. 이 인수는 주어진 네임 스페이스의 모든 이름을 나열하는 함수로 채워집니다. Globals ()는 그러한 함수 중 하나입니다.
-
==============================
6.파이썬 3.4.1을 사용한다면 질문에 대한 다른 대답을 얻을 수 있습니다.
파이썬 3.4.1을 사용한다면 질문에 대한 다른 대답을 얻을 수 있습니다.
list = [1,2,3] id(list[0]) id(list[1]) id(list[2])
보고:
1705950792 1705950808 # increased by 16 1705950824 # increased by 16
-5에서 256까지의 정수는 일정한 ID를 가지고 있으며, ID를 여러 번 발견 할 때마다 ID를 변경하기 전후에 다른 ID와는 달리 ID가 변경되지 않습니다. -5에서 256까지의 숫자는 증가하는 순서로 이드를 가지며 16만큼 다릅니다.
id () 함수가 반환하는 숫자는 메모리에 저장된 각 항목에 부여 된 고유 한 ID이며 C의 메모리 위치와 동일합니다.
-
==============================
7.이것은 의사가 말한 것과 똑같은, 메모리에있는 객체의 주소입니다. 그러나 메타 데이터가 첨부되어 있으며 메타 데이터를 저장하려면 메모리의 개체 및 위치 속성이 필요합니다. 따라서 list라는 변수를 만들 때 목록과 해당 요소의 메타 데이터도 만듭니다.
이것은 의사가 말한 것과 똑같은, 메모리에있는 객체의 주소입니다. 그러나 메타 데이터가 첨부되어 있으며 메타 데이터를 저장하려면 메모리의 개체 및 위치 속성이 필요합니다. 따라서 list라는 변수를 만들 때 목록과 해당 요소의 메타 데이터도 만듭니다.
따라서 언어의 절대적인 전문가가 아니라면 언어가 요소와 함께 할당하는 것을 모르기 때문에 이전 요소를 기반으로하는 목록의 다음 요소의 ID를 판별 할 수 없습니다.
-
==============================
8.대답은 거의 없습니다. ID는 주로 내부적으로 Python에 사용됩니다.
대답은 거의 없습니다. ID는 주로 내부적으로 Python에 사용됩니다.
평범한 파이썬 프로그래머는 코드에서 id ()를 사용할 필요가 없을 것입니다.
-
==============================
9.is 연산자는 두 개의 객체가 동일한지를 검사하기 위해이 객체를 사용합니다. id ()에서 반환되는 실제 값은 실제로 의미가 없기 때문에 거의 사용되지 않으며 플랫폼에 따라 다릅니다.
is 연산자는 두 개의 객체가 동일한지를 검사하기 위해이 객체를 사용합니다. id ()에서 반환되는 실제 값은 실제로 의미가 없기 때문에 거의 사용되지 않으며 플랫폼에 따라 다릅니다.
-
==============================
10.나는 로깅에 id () 값을 사용하는 아이디어가있다. 그것은 저렴하고 매우 짧습니다. 내 경우에는 토네이도를 사용하고 id ()는 웹 소켓을 통해 파일을 흩어져 섞은 메시지를 그룹화하는 앵커를 갖고 싶습니다.
나는 로깅에 id () 값을 사용하는 아이디어가있다. 그것은 저렴하고 매우 짧습니다. 내 경우에는 토네이도를 사용하고 id ()는 웹 소켓을 통해 파일을 흩어져 섞은 메시지를 그룹화하는 앵커를 갖고 싶습니다.
from https://stackoverflow.com/questions/15667189/what-is-the-id-function-used-for by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬으로 Quicksort (0) | 2018.10.03 |
---|---|
[PYTHON] IP가 파이썬 2.x에서 네트워크에 있는지 어떻게 확인할 수 있습니까? (0) | 2018.10.03 |
[PYTHON] 파이썬에서는 YAML 매핑을 OrderedDicts로 어떻게로드 할 수 있습니까? (0) | 2018.10.03 |
[PYTHON] numpy 배열을 통해 함수를 매핑하는 가장 효율적인 방법 (0) | 2018.10.03 |
[PYTHON] sys.stdout.flush () 메서드 사용 (0) | 2018.10.03 |