가변성은 객체의 아이덴티티(메모리 주소)를 변경하지 않고 객체를 변경할 수 있는지를 정의합니다:
함수에 대한 영향:
예시:
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]]
얕은 복사를 사용하여 복사본만 변경했다고 생각했지만 내부 객체는 여전히 공유되었습니다.