-
-
파이썬에서 메모리에 할당된 객체의 주소는 id( )함수를 사용하면 된다.
-
-
두 개의 변수에 각각 같은 값을 할당했다고 항상 같은 메모리 주소값을 가지지는 않는다.
-
-
왜 파이썬은 이렇게 작동하나?
-
파이썬의 변수는 상자가 아니다.
-
-
또 다른 예
-
-
-
b에다가 a의 값 [1, 2, 3]을 넣고서 4를 추가하였는데 왜 변수 a의 리스트가 [1, 2, 3]이 아닌 [1, 2, 3, 4]인걸까?
-
-
is 연산자를 통해 a변수와 b변수가 가지는 메모리주소가 가리키는 객체가 같음을 알 수 있다.
-
mutable한 객체 list와 immutable한 객체 str을 비교하여 보자.
-
Memory Visualization
Variables
다음과 같은 코드를 실행했다 가정해보자.
a = 10
=> a라는 이름의 변수공간에 정수 10을 넣었다. (x)
=> a가 '어떤 주소값'을 가지는데 그 '어떤 주소값'이 가리키는 공간에 100이라는 '값(value)'의 '정수형 객체(object)'가 존재한다.(o)
다시 말해 변수(variable)는 값(value)을 가진 객체(object)가 존재하는 곳을 가리키는 주소(memory address)를 가진다고 볼 수 있다.
파이썬에서 메모리에 할당된 객체의 주소는 id( )함수를 사용하면 된다.
aa = 123
bb = 124
print("aa의 메모리 주소 : ", id(aa))
print("bb의 메모리 주소 : ", id(bb))
aa의 메모리 주소 : 4504970160
bb의 메모리 주소 : 4504970192
두 개의 변수에 각각 같은 값을 할당했다고 항상 같은 메모리 주소값을 가지지는 않는다.
x = 100
y = 100
x is y
True
xx = 10000
yy = 10000
xx is yy
False
왜 파이썬은 이렇게 작동하나?
프로그램을 작성할때 자주 사용할 것 같은 범위의 정수값(integer)은 메모리에 한 번만 올려두고 이를 여러번 변수가 가리키게 함으로써 메모리를 효율적으로 사용하기 위해서다.
256까지는 id값이 같지만 257부터는 서로 다른 객체가 생성된다.
x = 256
y = 256
x is y
True
x = 257
y = 257
x is y
False
파이썬의 변수는 상자가 아니다.
- 파이썬 변수는 상자가 아니라
포스트잇
과 같은 존재라 생각해보자
a = [1, 2, 3]
b = a
b.append(4)
print(a)
를 하면 어떤 값이 나올까?
[1, 2, 3]이 나올까?
a = [1, 2, 3]
b = a
b.append(4)
print(a)
[1, 2, 3, 4]
또 다른 예
a = "hello"
b += " world"
print(b)
hello world
b에다가 a의 값 [1, 2, 3]을 넣고서 4를 추가하였는데 왜 변수 a의 리스트가 [1, 2, 3]이 아닌 [1, 2, 3, 4]인걸까?
이는 [1, 2, 3]이라는 값을 가진 리스트타입의 객체
에 a와 b라는 이름의 포스트잇을 붙였기 때문이다.
따라서 b에서 4를 추가하면 b가 가리키는 주소값을 타고서 [1, 2, 3]이라는 리스트 객체에 도달하여 4가 추가되는 것이기에 [1, 2, 3]이라는 리스트객체의 또다른 이름인 a에서도 같이 변경되는 것이다.
이처럼 파이썬에서는 하나의 객체에 여러 변수들을 할당할 수 있다. => aliasing
is 연산자를 통해 a변수와 b변수가 가지는 메모리주소가 가리키는 객체가 같음을 알 수 있다.
- is연산자가 비교하는 것은
객체의 메모리 주소
라는 것
a is b
True
mutable한 객체 list와 immutable한 객체 str을 비교하여 보자.
a = [1, 2, 3]
print(id(a))
a.append(1)
print(id(a))
4544356808
4544356808
a = "hello"
print(id(a))
a += " world"
print(id(a))
list에는 값을 추가해도 id값이 바뀌지 않지만 str의 경우에는 id값이 바뀐다.
str은 immutable이기에 값을 변경할 수 없을 뿐더러 id가 바뀐것은 값을 재할당
한 것이기 때문이다.
Memory Visualization
- 변수의 메모리주소값 변경 과정을 볼 수 있다.
ps.1. ipynb파일을 md파일로 변형하여 업로드한 것이니 보기 불편하신 분들은 ipynb로 열어보시는길 권합니다.
ps.2. 잘못된 개념에 대한 지적을 매우 환영합니다.
보고서 의아한 점이 있다면 부디 댓글 달아주세요.
'파이썬 문법' 카테고리의 다른 글
파이썬 리스트에 요소 추가 시 주의하기 (feat.속도) (0) | 2022.07.02 |
---|---|
논리연산자 실행시 주의사항 (0) | 2019.10.04 |
비트연산자와 논리연산자 (0) | 2019.08.18 |
쥬피터 노트북 기능 (0) | 2019.08.18 |
Hello-Javascript! (0) | 2019.07.21 |
Variables
다음과 같은 코드를 실행했다 가정해보자.
a = 10
=> a라는 이름의 변수공간에 정수 10을 넣었다. (x)
=> a가 '어떤 주소값'을 가지는데 그 '어떤 주소값'이 가리키는 공간에 100이라는 '값(value)'의 '정수형 객체(object)'가 존재한다.(o)
다시 말해 변수(variable)는 값(value)을 가진 객체(object)가 존재하는 곳을 가리키는 주소(memory address)를 가진다고 볼 수 있다.
파이썬에서 메모리에 할당된 객체의 주소는 id( )함수를 사용하면 된다.
aa = 123
bb = 124
print("aa의 메모리 주소 : ", id(aa))
print("bb의 메모리 주소 : ", id(bb))
aa의 메모리 주소 : 4504970160
bb의 메모리 주소 : 4504970192
두 개의 변수에 각각 같은 값을 할당했다고 항상 같은 메모리 주소값을 가지지는 않는다.
x = 100
y = 100
x is y
True
xx = 10000
yy = 10000
xx is yy
False
왜 파이썬은 이렇게 작동하나?
프로그램을 작성할때 자주 사용할 것 같은 범위의 정수값(integer)은 메모리에 한 번만 올려두고 이를 여러번 변수가 가리키게 함으로써 메모리를 효율적으로 사용하기 위해서다.
256까지는 id값이 같지만 257부터는 서로 다른 객체가 생성된다.
x = 256
y = 256
x is y
True
x = 257
y = 257
x is y
False
파이썬의 변수는 상자가 아니다.
- 파이썬 변수는 상자가 아니라
포스트잇
과 같은 존재라 생각해보자
a = [1, 2, 3]
b = a
b.append(4)
print(a)
를 하면 어떤 값이 나올까?
[1, 2, 3]이 나올까?
a = [1, 2, 3]
b = a
b.append(4)
print(a)
[1, 2, 3, 4]
또 다른 예
a = "hello"
b += " world"
print(b)
hello world
b에다가 a의 값 [1, 2, 3]을 넣고서 4를 추가하였는데 왜 변수 a의 리스트가 [1, 2, 3]이 아닌 [1, 2, 3, 4]인걸까?
이는 [1, 2, 3]이라는 값을 가진 리스트타입의 객체
에 a와 b라는 이름의 포스트잇을 붙였기 때문이다.
따라서 b에서 4를 추가하면 b가 가리키는 주소값을 타고서 [1, 2, 3]이라는 리스트 객체에 도달하여 4가 추가되는 것이기에 [1, 2, 3]이라는 리스트객체의 또다른 이름인 a에서도 같이 변경되는 것이다.
이처럼 파이썬에서는 하나의 객체에 여러 변수들을 할당할 수 있다. => aliasing
is 연산자를 통해 a변수와 b변수가 가지는 메모리주소가 가리키는 객체가 같음을 알 수 있다.
- is연산자가 비교하는 것은
객체의 메모리 주소
라는 것
a is b
True
mutable한 객체 list와 immutable한 객체 str을 비교하여 보자.
a = [1, 2, 3]
print(id(a))
a.append(1)
print(id(a))
4544356808
4544356808
a = "hello"
print(id(a))
a += " world"
print(id(a))
list에는 값을 추가해도 id값이 바뀌지 않지만 str의 경우에는 id값이 바뀐다.
str은 immutable이기에 값을 변경할 수 없을 뿐더러 id가 바뀐것은 값을 재할당
한 것이기 때문이다.
Memory Visualization
- 변수의 메모리주소값 변경 과정을 볼 수 있다.
ps.1. ipynb파일을 md파일로 변형하여 업로드한 것이니 보기 불편하신 분들은 ipynb로 열어보시는길 권합니다.
ps.2. 잘못된 개념에 대한 지적을 매우 환영합니다.
보고서 의아한 점이 있다면 부디 댓글 달아주세요.
'파이썬 문법' 카테고리의 다른 글
파이썬 리스트에 요소 추가 시 주의하기 (feat.속도) (0) | 2022.07.02 |
---|---|
논리연산자 실행시 주의사항 (0) | 2019.10.04 |
비트연산자와 논리연산자 (0) | 2019.08.18 |
쥬피터 노트북 기능 (0) | 2019.08.18 |
Hello-Javascript! (0) | 2019.07.21 |