아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
호기로운게253
호기로운게25320.09.09

[파이썬]이 두 코드가 무슨 차인지 알고 싶어요.

class Mylist(list): def replace(self, old, new): for i in self: if i == old: self[self.index(i)] = new return a = Mylist([1, 2, 3, 4, 5]) a.replace(2, 4) a ----결과--- [1, 4, 3, 4, 5]class Mylist(list): def replace(self, old, new): new_list = list(map(lambda x : new if x == old else x, self)) self = new_list a = Mylist((1, 2, 3, 4, 5)) a.replace(2, 4) a ---결과--- [1, 2, 3, 4, 5]

제가볼땐 위의 코드와 아래의 코드가 같은 결과값이 나와야 한다고 생각하는데.. 왜 기존의 self 에 new list가 할당이 안되나요? ㅠ 뭔가 스코프를 놓치고 있는 것 같은데 궁금합니다!

55글자 더 채워주세요.
답변의 개수
2개의 답변이 있어요!
  • self = new_list

    는 local variable로 저장되고 self로 저장되지 않습니다.

    따라서, 코드를 수정하셔야 됩니다.

    class Mylist(list): def replace(self, old, new): new_list = list(map(lambda x : new if x == old else x, self)) return new_list a = Mylist((1, 2, 3, 4, 5)) b = a.replace(2, 4) b


  • 안녕하세요,

    self에 new_list를 할당 할 때, 값이 복사되는 것이 아니라, self가 가르키는 메모리 주소를 newlist의 메모리 주소로 대체하게 됩니다. (call_by_reference라고 부릅니다.)

    더불어 self의 scope는 replace 함수 내이기 때문에, scope를 벗어나면 self의 바뀐 메모리 주소가 사라지게 됩니다.

    그러므로 a의 메모리 주소는 변경되지 않게 됩니다.

    class Mylist(list): def replace(self, old, new): new_list = list(map(lambda x : new if x == old else x, self)) print("self의 address : ", id(self), "new_list의 address : ", id(new_list)) self = new_list print("self의 address : ", id(self), "new_list의 address : ", id(new_list))

    self의 address : 139620688521456 new_list의 address : 139620761959872 self의 address : 139620761959872 new_list의 address : 139620761959872

    감사합니다.