참조와 할당 비교를 해보자

  • 불변객체란?

우리가 C언어에선

int a = 10;
int b = a;
b = 7;
printf("%d,%d", a, b);

위와 같은 C언어로는 b가 7이므로 a도 7이 된다. b와 a가 서로 참조하기때문이다.


하지만 불변객체는 그 값이 변하지 않는다.

a = 10
b = a #b는 a를 참조한다.
print(id(10), id(a), id(b)) 
# 4393858752, 4393858752, 4393858752
b = 7
print(a, b)
# 10, 7  # 불변객체라 변하지않는다.

불변객체이기때문에 a가 값이 변하지 않는다. 문자열 str도 마찬가지이다.

  • 가변객체란?

반면 가변객체란 값이 바뀔수 있으며, 이 말은 다른 변수가 참조하고 있을 때 그 변수의 값 또한 변경된다.

a = [1, 2, 3, 4, 5]
b = a # b는 a를 참조한다.
print(b) # [1, 2, 3, 4, 5]
a[2] = 4
print(a, b) # [1, 2, 4, 4, 5] [1, 2, 4, 4, 5]
  • 참조에 의한 복사와 값에 의한 복사

가변객체는 변할 수 있기 때문에, 참조당한 값이 변하면 그 참조한 값도 변한다.

  a=[4,7]
  b=a
  print(a, b) # [4, 7] [4, 7]
  a[1]=8
  print(a, b) # [4, 8] [4, 8]

하지만 값에 의한 복사를 할 경우, 참조가 아닌 값 복사이기때문에 변하지 않는다. 즉, 불변객체와 비슷한 느낌이라구 보면 된다.

  a=[4,7]
  b=a[:] #값에 의한 복사
  print(a,b) # [4, 7] [4, 7]
  a[1]=8
  print(a, b) # [4, 8] [4, 7]

1. 불변/가변 객체

1. 불변과 가변의 차이

  • 같은 데이터가 주었을때

    • 가변객체 : 같은 데이터 선언

    print("s1:", s) # ['h', 'e', 'l', 'l', 'o']
    print("s1:", id(s)) # 4302910720
    
    s = ["h", "e", "l", "l", "o"]
    print("s2", s) # ['h', 'e', 'l', 'l', 'o']
    print("s2:", id(s))  # 4303608160
    
    s = ["h", "e", "l", "l", "o"]
    print("s3:", s)  # ['h', 'e', 'l', 'l', 'o']
    print("s3:", id(s)) # s: 4389130480
      
    

    같은 값이어도 전부다 다르다

    • 불변객체 : 같은 데이터 선언

      • 숫자

        num = 4
        print("num:", id(num))
        #num: 4541833072
        num = 4
        print("num:", id(num))
        #num: 4541833072
        num2 = 4
        print("num2:", id(num2))
        #num2: 4541833072
        
      • 문자열

        str_num = '123'
        print("str_num:", id(str_num))
        # str_num: 4516378672
        str_num = '123'
        print("str_num:", id(str_num))
        # str_num: 4516378672
        str_num2 = '123'
        print("str_num2:", id(str_num2))
        # str_num: 4516378672
        

        같은값이면 주소가 전부 같다.

  • 객체의 내부조작

    • 가변객체의 내부조작

      s = ["h", "e", "l", "l", "o"]
      print(id(s))
      # s의 id :4407217216
      s[0] = "e"
      print("s:", s)
      #s: ['e', 'e', 'l', 'l', 'o']
      print(id(s))
      # s의 id :4407217216
      
    • 불변객체의 내부조작

      s = "hellow"
      print(id(s))
      s[3] = "e"
      print("s:", s)
      print(id(s))
      # TypeError: 'str' object does not support item assignment
      

      오류가 뜬다

2. 가변객체와 불변객체의 공통점

  • 가변객체 = 가변객체

s = ["h", "e", "l", "l", "o"]
print("s:", id(s)) # s: 4470591104
str_list = ["a", "b", "c"]
print("str_list:", id(str_list)) # str_list: 4388907600
s = str_list
print("copy_str_list:", id(str_list)) # copy_str_list: 4388907600
print("copy_s: ", id(s)) # copy_s:  4388907600
  • 불변객체 = 불변객체

num = 3
print("num:", num)
print("num(id):", id(num))
#num: 3
#num(id): 4405852528
num2 = 1
print("num2:", num2)
print("num2(id):", id(num2))
#num2: 1
#num2(id): 4405852464

num2 = num
print("num2:", num2)
print("num2(id):", id(num2))
#num2: 3
#num2(id): 4405852528

댓글 쓰기