Python 변수 및 메모리 관리

5474 단어 programmingpython

변수


변수는 컴퓨터 프로그램이 접근하는 메모리 위치의 한 방식을 가리킨다.C, C++, 자바 등 언어에서 변수는 메모리 위치에 대한 이름입니다.그래서 우리가 말하기를:
int x;
float y;
그것은 컴파일러가 두 변수에 메모리 공간을 만들고, 변수마다 4바이트를 만들어야 한다. (크기는 컴파일러와 프로그래밍 언어에 달려 있다.)변수는 기본적으로 메모리 위치에 분배된 이름이고 변수 유형이 정형이면 정수만 저장할 수 있다.

그러나python에서 우리는 변수를 미리 설명할 필요가 없다. 예를 들어 int x, 우리는 변수를 직접 정의하고 그것을 사용하기 시작할 수 있다. 예를 들어 x = 10.
그러면 파이톤은 변수의 종류를 어떻게 알고 접근합니까?
Python에서 모든 물건 (정수, 목록, 문자열, 함수 등) 은 하나의 대상이며, 모든 대상은 하나의 유일한 id를 가지고 있으며, 대상을 만들 때 분배된다.변수는 이러한 객체에 대한 참조(포인터)입니다.우리가 말하기를:
x = 10
  • 파이톤 실행 코드의 오른쪽
  • 10을 정수로 표시
  • Integer 클래스 작성 객체
  • 부치x는 정수 대상 10
  • 을 인용한다.

    우리가 y와 같은 변수x를 만들 때 내부에 무슨 일이 일어날 것 같습니까?
    y = x
    
    y는 현재 x와 같은 대상을 가리킨다.

    우리가 어떻게 알았지?
    이 두 변수xy가 가리키는 대상의 id를 검사해서 검증할 수 있습니다.
    id(y) == id(x)
    # output
    True
    
    대상의 id도 출력할 수 있습니다
    print(f"id of the object pointed by x:{id(x)}")
    print(f"id of the object pointed by y:{id(y)}") 
    
    # output
    #your id value might be different from mine but the two ids printed must be same
    id of the object pointed by x:140733799282752 
    id of the object pointed by y:140733799282752
    
    지금 우리가 y에 값을 부여한다면?
    y = 40
    
    이것은 40의 정수 대상을 만들 것입니다. y 이제 10이 아닌 40을 인용합니다.

    어떻게 조사합니까?
    마찬가지로 id()를 사용하여 객체의 ID를 봅니다.
    print(x) # outputs 10
    print(y) # outputs 40
    
    print(f"id of the object pointed by x:{id(x)}")
    print(f"id of the object pointed by y:{id(y)}")  
    
    # output
    id of the object pointed by x:140733799282752
    id of the object pointed by y:140733799283712
    
    위에서 볼 수 있듯이 이 두 ID는 현재 다르다. 이것은 40 값의 새 대상을 만들었고 y 현재 이 대상을 인용했다는 것을 의미한다.
    만약 우리가 변수x에 값을 부여하고 싶다면
    x = "python"
    print(id(x))
    
    # output
    1783541430128
    
    우리는 대상 id를 얻을 것입니다. 이 id는 id(x) 이전에 인덱스 대상 10 을 인쇄한 id와 다르다. "140733799282752".
    그럼 인덱스 대상10에게 무슨 일이 일어났나요?정수 객체 10이 현재 참조되지 않은 상태로 유지되어 더 이상 액세스할 수 없습니다.파이썬은 더 이상 접근할 수 없는 대상을 찾고 메모리를 회수해 다른 용도로 사용할 수 있는 스마트 스팸 수집 시스템을 갖추고 있다.

    마지막 질문: 만약 우리가 같은 값을 가진 두 개의 정수 대상을 만들면?
    p = 100
    q = 100
    
    내가 이 질문에 대답하기 전에그들의 신분증을 검사해 봅시다.
    print(f"id of the object pointed by x:{id(p)}")
    print(f"id of the object pointed by y:{id(q)}") 
    # output
    id of object pointed by x:140733799285632
    id of object pointed by y:140733799285632
    
    따라서python은 값이 100인 정수 대상을 만들어서 메모리 분배를 최적화하고 변수pq를 가리키는 것이다.
    한 가지 예를 더 봅시다 -
    m = 350
    n = 350
    
    print(f"id of object pointed by x:{id(m)}")
    print(f"id of object pointed by y:{id(n)}") 
    
    # output
    id of object pointed by x:1783572881872
    id of object pointed by y:1783572881936
    
    놀랍게도 mn가 가리키는 정수 대상 300의 ID는 다르다.
    이게 어떻게 된 일입니까?
    Python은 시작할 때 [-5256] 범위의 정수에 메모리를 분배합니다. 즉, 이 값에 정수 대상을 만들고 ID를 분배합니다.이 과정도 정수 캐시라고 부른다.따라서 이 범위 내에서 정수를 인용할 때마다python 변수는 대상의 캐시 값을 가리킨다.이것이 바로 pq가 인용한 정수 대상 100의 대상 id가 같은 id를 출력하는 이유입니다.범위 [-5256] 이외의 정수의 경우 프로그램이 실행되는 동안 정의된 객체가 작성됩니다.이것이 mn가 인용한 정수 대상 350의 ID가 다른 이유다.
    앞에서 말한 바와 같이 변수는 메모리에 저장된 대상을 가리킨다.따라서 변수는 모든 유형의 대상을 자유롭게 가리킬 수 있다.
    x = 10 # x points to an object of 'int' type
    x = ["python", 20, "apple"] # x now points to an object of type 'list'
    x = "python" # x now points to a string type object
    
    이로써 우리는 변수 내부 업무에 관한 단문을 끝냈다.나는 네가 그것을 즐겨 읽기를 바란다.글이나 다른 당신이 더 알고 싶은 화제에 대해 개선 제안을 하는 것을 환영합니다.
    나는 print 문장에서 f 문자열의 개념을 광범위하게 사용했다.자세한 내용은 this article.에서 확인할 수 있습니다.
    전화 좀 받아주세요.
    Github ❤️

    좋은 웹페이지 즐겨찾기