python의 메모리 분배 메커니즘을 상세히 설명하다

4756 단어 python메모리할당

시작하다


예를 들어, 네 개의 변수를 생성하고 값을 지정합니다.

variable1 = 1
variable2 = "abc"
variable3 = (1,2)
variable4 = ['a',1]

# ids
print('Variable1: ', id(variable1))
print('Variable2: ', id(variable2))
print('Variable3: ', id(variable3))
print('Variable4: ', id(variable4))
인쇄 결과는 다음과 같습니다.
변수 1:1747938368
변수 2:152386423976
변수 3: 152382712136
변수 4:15238263160
모든 변수는 새로운 메모리 주소 (정수로 표시) 를 할당합니다.첫 번째 가설은 우리가'='를 사용하여 변수에 값을 부여할 때마다, Python은 변수를 저장하기 위해 새로운 메모리 주소를 만들 것이다.이게 100% 맞는 건가요?당연히 아니지!
나는 두 개의 새로운 변수 (5와 6) 를 만들고 기존 변수의 값을 사용하여 그것들에게 값을 부여할 것이다.

variable5 = variable1
variable6 = variable4

print('Variable1: ', id(variable1))
print('Variable4: ', id(variable4))
print('Variable5: ', id(variable5))
print('Variable6: ', id(variable6))
Python 인쇄 결과:
변수 1:1747938368
변수 4:819035469000
변수 5:1747938368
변수 6: 819035469000
파이썬이 이 두 변수에 새 메모리 주소를 만들지 않았다는 것을 알아차렸습니까?이번에는 단지 두 개의 새로운 변수를 기존 변수와 같은 저장 위치를 가리켰을 뿐이다.
이제 변수 1에 새 값을 설정합니다.참고: 정수는 변경할 수 없는 데이터 유형입니다.

print('Variable1: ', id(variable1))
variable1 = 2
print('Variable1: ', id(variable1))
인쇄:
Variable1: 1747938368
Variable1: 1747938400
이것은 우리가 = 를 사용하고 기존 변수에 새 값을 부여할 때마다 내부에 새 메모리 주소를 만들어서 이 변수를 저장한다는 것을 의미한다.그것이 성립되었는지 봅시다!
값이 가변 데이터 형식일 때 어떤 일이 발생합니까?variable6는 목록의 끝에 append의 값을 입력하고 메모리 주소를 출력하는 목록입니다.

print('Variable6:',id(variable6))
variable6.append('new')
print('Variable6:',id(variable6))
변수의 메모리 주소는 변하지 않습니다. 변수는 변수 데이터 형식이기 때문에 요소만 업데이트되었습니다.
Variable6:678181106888
Variable6:678181106888
함수를 만들고 변수를 전달합시다.만약 우리가 함수 내부에 변수의 값을 설정한다면, 그것은 무슨 일이 일어날까요?평가해 봅시다.

def update_variable(variable_to_update):
    print(id(variable_to_update))
update_variable(variable6)
print('Variable6: ', id(variable6))
주의, variable_to_업데이트의 ID는 변수 6의 ID를 가리킵니다.
함수에서 variable_를 업데이트하면to_업데이트 및 variable_to_업데이트는 가변 데이터 형식입니다.variable6의 값이 업데이트됩니다.구체적인 예를 살펴보겠습니다.

variable6 = ['new']
print('Variable6: ', variable6)

def update_variable(variable_to_update):
    variable_to_update.append('inside')
update_variable(variable6)
print('Variable6: ', variable6)
인쇄:
Variable6:['new']
Variable6:['new','inside']
이것은 함수에 변수를 업데이트하는 방법을 보여 줍니다. 함수 클래스와 함수 밖의 변수가 모두 같은 ID를 가지고 있음을 볼 수 있습니다.
만약 우리가 함수 안에 변수에 새로운 값을 부여한다면 (업데이트가 아니라) 변수가 변하지 않든 변하지 않는 데이터 형식이든, 함수를 종료하면 변경은 잃어버릴 것이다.

print('Variable6: ', variable6)

def update_variable(variable_to_update):
    print(id(variable_to_update))
    variable_to_update = ['inside']
update_variable(variable6)
print('Variable6: ', variable6)
Variable6:['new']
344115201992
Variable6:['new']
지금은 재미있는 장면입니다. Python은 항상 모든 새로운 변수에 새로운 메모리 주소를 만들지 않습니다.
마지막으로, 만약 우리가 두 개의 다른 변수에 문자열 값을 분배한다면, 예를 들어 "a"는 어떻게 해야 합니까?그것은 두 개의 메모리 주소를 만들 수 있습니까?

variable_nine ="a"
variable_ten ="a"
print('Variable9:',id(variable_nine))
print('Variable10:',id(variable_ten))
이 두 변수는 동일한 메모리 위치를 가지고 있습니다.
Variable9:792473698064
Variable10:792473698064
만약 우리가 두 개의 다른 변수를 만들고 긴 문자열 값을 분배한다면 어떻게 해야 합니까?

variable_nine = "a" * 21
variable_ten = "a" * 21
print('Variable9: ', id(variable_nine))
print('Variable10: ', id(variable_ten))
이번에 Python은 두 변수에 대해 두 개의 다른 메모리 위치를 만들었습니다.
Variable9:541949933872
Variable10:541949933944
왜?이것은 Python이 시작할 때 내부 값 캐시를 만들기 때문에 더 빠른 결과를 제공하기 위해서입니다.파이썬은 소량의 정수(예: -5에서 256 사이)와 작은 문자열 값에 소량의 메모리 주소를 할당합니다.이것이 바로 우리가 예시한 짧은 문자열이 모두 같은 ID를 가지고 있는 이유이고, 긴 문자열의 ID는 다르다.

= = vs 예


때때로 우리는 두 대상이 같은지 아닌지를 검사하고 싶다.
  • 만약 우리가 ==를 사용한다면, 그것은 두 파라미터가 같은 데이터를 포함하고 있는지 검사할 것이다
  • 만약에 우리가 is를 사용한다면, Python은 두 대상이 같은 대상을 인용하는지 검사할 것입니다. 이때 두 대상의 id는 반드시 같아야 합니다
  • 
    var1 = "a" * 30 
    var2 = "a" * 30 
    print('var1:',id(var1))#318966315648 
    print('var2:',id(var2))#168966317364 
    
    print('==:', var1 == var2)# True 
    print('is:',var1 is var2)# False
    이상은python의 메모리 분배 메커니즘에 대한 상세한 내용입니다. 더 많은python 메모리 분배 메커니즘에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기