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 예
때때로 우리는 두 대상이 같은지 아닌지를 검사하고 싶다.
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 메모리 분배 메커니즘에 대한 자료는 저희 다른 관련 글을 주목해 주십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.