복붙노트

[PYTHON] id () 함수는 무엇을 위해 사용됩니까?

PYTHON

id () 함수는 무엇을 위해 사용됩니까?

나는 파이썬 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. ==============================

    1.게시물에 몇 가지 질문이 있습니다.

    게시물에 몇 가지 질문이 있습니다.

    그것은 "정수 (또는 긴 정수)가 유일하고 그 개체의 수명 동안 상수가 보장됩니다." (파이썬 표준 라이브러리 - 내장 함수) 고유 번호. 더 이상 아무것도, 덜 아무것도. 이것을 파이썬 객체의 사회 보장 번호 또는 직원 ID 번호라고 생각하십시오.

    개념적으로 그렇습니다. 평생 동안 우주에서 유일무이하다는 것을 보장합니다. 그리고 Python의 특정 구현에서 실제로는 해당 C 객체의 메모리 주소입니다.

    목록은 배열이 아니므로 목록 요소는 참조가 아니라 객체입니다.

    거의. id () (또는 이와 동등한)가 is 연산자에서 사용됩니다.

  2. ==============================

    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. ==============================

    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. ==============================

    4.나는 Python으로 시작하고 있으며, 대화 형 쉘을 사용하여 내 변수가 동일한 변수에 할당되었는지 또는 동일한 변수인지 여부를 확인하기 위해 ID를 사용합니다.

    나는 Python으로 시작하고 있으며, 대화 형 쉘을 사용하여 내 변수가 동일한 변수에 할당되었는지 또는 동일한 변수인지 여부를 확인하기 위해 ID를 사용합니다.

    모든 값은 컴퓨터의 메모리에 저장되는 위치와 관련된 고유 번호 인 ID입니다.

  5. ==============================

    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. ==============================

    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. ==============================

    7.이것은 의사가 말한 것과 똑같은, 메모리에있는 객체의 주소입니다. 그러나 메타 데이터가 첨부되어 있으며 메타 데이터를 저장하려면 메모리의 개체 및 위치 속성이 필요합니다. 따라서 list라는 변수를 만들 때 목록과 해당 요소의 메타 데이터도 만듭니다.

    이것은 의사가 말한 것과 똑같은, 메모리에있는 객체의 주소입니다. 그러나 메타 데이터가 첨부되어 있으며 메타 데이터를 저장하려면 메모리의 개체 및 위치 속성이 필요합니다. 따라서 list라는 변수를 만들 때 목록과 해당 요소의 메타 데이터도 만듭니다.

    따라서 언어의 절대적인 전문가가 아니라면 언어가 요소와 함께 할당하는 것을 모르기 때문에 이전 요소를 기반으로하는 목록의 다음 요소의 ID를 판별 할 수 없습니다.

  8. ==============================

    8.대답은 거의 없습니다. ID는 주로 내부적으로 Python에 사용됩니다.

    대답은 거의 없습니다. ID는 주로 내부적으로 Python에 사용됩니다.

    평범한 파이썬 프로그래머는 코드에서 id ()를 사용할 필요가 없을 것입니다.

  9. ==============================

    9.is 연산자는 두 개의 객체가 동일한지를 검사하기 위해이 객체를 사용합니다. id ()에서 반환되는 실제 값은 실제로 의미가 없기 때문에 거의 사용되지 않으며 플랫폼에 따라 다릅니다.

    is 연산자는 두 개의 객체가 동일한지를 검사하기 위해이 객체를 사용합니다. id ()에서 반환되는 실제 값은 실제로 의미가 없기 때문에 거의 사용되지 않으며 플랫폼에 따라 다릅니다.

  10. ==============================

    10.나는 로깅에 id () 값을 사용하는 아이디어가있다. 그것은 저렴하고 매우 짧습니다. 내 경우에는 토네이도를 사용하고 id ()는 웹 소켓을 통해 파일을 흩어져 섞은 메시지를 그룹화하는 앵커를 갖고 싶습니다.

    나는 로깅에 id () 값을 사용하는 아이디어가있다. 그것은 저렴하고 매우 짧습니다. 내 경우에는 토네이도를 사용하고 id ()는 웹 소켓을 통해 파일을 흩어져 섞은 메시지를 그룹화하는 앵커를 갖고 싶습니다.

  11. from https://stackoverflow.com/questions/15667189/what-is-the-id-function-used-for by cc-by-sa and MIT license