• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

shallow copy 질문 있습니다.

24.06.10 21:09 작성 조회수 69

1

a=[1,2,3,4,5] 
b=a[:] 
b.append(6) 
print(id(a[0]),id(b[0])) 
a[0]=-1 
print(id(a[0]),id(b[0]))

위 코드에서 강사님께서 말씀하신대로 b=a[:] 했을때 각 a와 b의 elment들이 같은 id인것을 확인 했습니다.

그런데 a[0]=-1을 했을때 새로운 주소에 할당이 되는것 같은데요 이유가 뭔지 궁금합니다.

그리고 혹시 id로 접근해서 값을 변경하는것도 가능한가요?

답변 3

·

답변을 작성해보세요.

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.06.10

안녕하세요, 인프런 AI 인턴입니다.

kokp님의 질문과 관련하여, 제공된 지식공유자의 답변 중에 b=a[:]를 사용한 상황에 대해 설명하는 부분이 있어 이와 관련된 자료를 찾아보았습니다.

강의 “실리콘밸리 엔지니어가 가르치는 파이썬 기초부터 고급까지“에서 언급된 내용에 따르면, b=a[:]는 리스트 a의 얕은 복사를 의미하는데, 이 경우 ab는 서로 다른 객체가 됩니다. 즉, ab는 같은 값을 가지고 있지만, 서로 다른 메모리 주소를 가리킵니다. 따라서, 한 리스트에 대한 변경이 다른 리스트에 영향을 주지 않습니다. 이는 얕은 복사의 특성 중 하나로, 얕은 복사된 리스트는 원본 리스트의 각 요소들을 새 리스트에 복사하지만, 복사된 요소들은 원본 요소들과 같은 객체(즉, 같은 메모리 주소를 가리키는)를 참조합니다.

질문에서 언급한 a[0]=-1의 경우, a[0]에 새로운 값 -1을 할당하면서 a[0]은 새로운 객체 -1을 참조하게 됩니다. 이는 Python에서 정수와 같은 불변 객체(immutable object)는 값이 변경될 때 새로운 객체를 생성하고 해당 메모리 주소를 참조하게 되기 때문입니다. 따라서 a[0]의 메모리 주소가 변경된 것입니다. 이와는 달리, b 리스트는 a 리스트의 얕은 복사본이기 때문에, a의 요소에 대한 변경이 b에는 반영되지 않습니다.

또한, Python에서는 직접적으로 메모리 주소를 사용하여 값을 변경하는 것은 기본적으로 제공되지 않습니다. Python은 높은 수준의 언어로, 메모리 관리를 추상화하고 있으멀로 사용자가 직접 메모리 주소에 접근하여 값을 변경하는 것은 일반적인 사용 사례에서 지원하지 않습니다.

질문에서의 상황을 이해하는 데 도움이 되었기를 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

kokp님의 프로필

kokp

질문자

2024.06.11

감사합니다~

0

흐음... 인프런AI 인턴이 열일하는군요 ㅎㅎㅎ

제가 할말을 다 해버렸네요. 혹시 더 궁금하신 거 있으시면 질문 올리시면 됩니다.

채널톡 아이콘