프로그래밍Python 백엔드 개발자

파이썬에서 객체의 가변성(mutable/immutable)이란 무엇입니까? 이것이 함수 및 매개변수 전달에 어떤 영향을 미칩니까? 일반적인 오류의 예를 제시하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

가변성은 객체의 아이덴티티(메모리 주소)를 변경하지 않고 객체를 변경할 수 있는지를 정의합니다:

  • 가변 객체(예: list, dict, set)는 변경할 수 있습니다: 요소 추가, 수정 또는 삭제.
  • 불변 객체(예: int, str, tuple, frozenset)는 생성 후 변경할 수 없으며, 모든 "변경"은 새로운 객체를 만듭니다.

함수에 대한 영향:

  • 가변 객체를 함수에 전달하면 함수는 이를 변경할 수 있습니다.
  • 불변 객체는 함수 내부에서 "교체"하더라도 변경되지 않습니다.

예시:

def f(lst): lst.append(42) data = [] f(data) print(data) # [42] def f2(x): x += 1 n = 1 f2(n) print(n) # 1

속임수가 있는 질문.

"다음 코드는 무엇을 출력합니까?"

def foo(bar=[]): bar.append(1) return bar print(foo()) print(foo())

답변: 출력은:

[1]
[1, 1]

함수의 매개변수는 정의 시 한 번만 초기화되고, 호출 시마다 초기화되지 않기 때문입니다. 함수의 매개변수에서 리스트(및 다른 가변 객체)는 인기 있는 함정입니다.

주제의 미묘함을 모름으로써 발생한 실제 오류의 예.


이야기

REST API에서 기본 매개변수를 통해 목록을 반환했습니다:

def get_default_items(items=[]): items.append('x') return items

몇 번의 호출 후에 목록이 커지는 것을 발견했으며, 단일 요소만 반환될 것으로 예상했습니다.


이야기

함수에서 문자열을 "교체"할 계획이었습니다:

def replace_word(word): word.replace('a', 'b') word = 'data' replace_word(word) print(word) # 'dbtb'를 기대했지만 'data'를 얻었습니다.

str 메소드는 원래 문자열을 변경하지 않고 새로운 문자열을 반환하지만, 반환된 값을 무시했습니다.


이야기

중첩 구조로 작업할 때:

original = [[1, 2], [3, 4]] copy = original[:] copy[0][0] = -1 print(original) # [[-1, 2], [3, 4]]

얕은 복사를 사용하여 복사본만 변경했다고 생각했지만 내부 객체는 여전히 공유되었습니다.