소개
이 랩에서는 Python 할당과 참조의 기본 사항을 다룹니다. Python 이 할당을 처리하는 방식, 참조를 생성하는 방법, 그리고 가변 (mutable) 및 불변 (immutable) 객체를 다루는 방법을 살펴보겠습니다.
이 랩에서는 Python 할당과 참조의 기본 사항을 다룹니다. Python 이 할당을 처리하는 방식, 참조를 생성하는 방법, 그리고 가변 (mutable) 및 불변 (immutable) 객체를 다루는 방법을 살펴보겠습니다.
Python 에서 할당은 이름 (name) 을 객체 (object) 에 바인딩 (binding) 하는 과정입니다. 할당 문 (assignment statement) 은 다음과 같은 일반적인 형식을 갖습니다.
variable = expression
오른쪽 항의 표현식 (expression) 이 평가되고, 그 값이 왼쪽 항의 변수 (variable) 에 할당됩니다.
간단한 예제를 살펴보겠습니다.
터미널을 열고 다음 명령을 터미널에 입력합니다.
python3
그런 다음, 다음 코드를 입력합니다.
## 변수 'x'에 값 42 를 할당하고 출력합니다.
x = 42
print(x)
출력:
42
여기서, 우리는 연산자 =를 사용하여 x를 변수 42에 할당합니다. 그런 다음, x의 값을 출력합니다.
Python 에서 변수는 객체에 대한 참조 (reference) 입니다. 변수에 값을 할당할 때, 실제로 해당 값을 나타내는 객체에 대한 참조를 생성하는 것입니다.
이 개념을 설명하기 위한 예제는 다음과 같습니다.
## Python 참조를 설명합니다.
x = [1, 2, 3]
y = x
y.append(4)
print("x:", x)
print("y:", y)
출력:
x: [1, 2, 3, 4]
y: [1, 2, 3, 4]
이 예제에서 x와 y는 모두 동일한 리스트 객체를 참조합니다. 4를 추가하여 y 참조를 통해 리스트를 수정하면, 변경 사항이 x와 y 모두에 반영됩니다.
Python 에는 두 가지 유형의 객체가 있습니다: 가변 (mutable) 객체와 불변 (immutable) 객체입니다.
가변 객체는 생성된 후 수정될 수 있습니다. 리스트 (list), 딕셔너리 (dictionary), 세트 (set) 는 가변 객체의 예입니다.
불변 객체는 생성된 후 수정될 수 없습니다. 정수 (integer), 부동 소수점 (float), 문자열 (string), 튜플 (tuple) 은 불변 객체의 예입니다.
가변 객체와 불변 객체의 차이점을 보여주는 예제를 살펴보겠습니다.
## 가변 객체 예시
mutable_list = [1, 2, 3]
another_mutable_list = mutable_list
another_mutable_list.append(4)
print("mutable_list:", mutable_list)
출력:
mutable_list: [1, 2, 3, 4]
mutable_list는 가변 객체이므로 리스트의 끝에 4를 추가합니다. 하지만 불변 객체는 생성된 후 수정될 수 없습니다.
## 불변 객체 예시
immutable_string = "hello"
another_immutable_string = immutable_string
another_immutable_string = another_immutable_string.upper()
print("immutable_string:", immutable_string)
출력:
immutable_string: hello
변경 사항이 없으며, 다음과 같이 immutable_string을 변경하려는 경우 Python 셸은 TypeError를 발생시킵니다.
immutable_string[0] = '1'
출력:
TypeError: 'str' object does not support item assignment
지금까지 배운 개념을 강화하기 위해 몇 가지 더 많은 예시를 살펴보겠습니다.
함수에서 가변 객체를 기본 인수로 사용하는 것을 피하십시오.
def bad_append(new_item, a_list=[]):
a_list.append(new_item)
return a_list
print(bad_append('one'))
출력:
['one']
보기에는 좋지만, 이 함수를 다시 호출하면 다음과 같습니다.
print(bad_append('two'))
출력:
['one', 'two']
여기서 문제는 a_list의 기본값이 함수 정의 시점에 평가된다는 것입니다. 따라서 함수를 호출할 때마다 동일한 기본값을 얻게 됩니다. 올바른 방법은 함수 내부에서 런타임에 생성하는 것입니다.
def append_to_list(item: int, a_list: list = None) -> list:
"""Append an item to a list and return the updated list."""
if a_list is None:
a_list = []
a_list.append(item)
return a_list
list_a = append_to_list(1, [1, 2, 3])
print(list_a)
출력:
[1, 2, 3, 1]
가변 객체의 복사본으로 작업하려는 경우 copy 모듈을 사용하여 새 객체를 생성합니다.
import copy
## copy 모듈 사용법을 보여줍니다.
original_list = [1, 2, 3]
copied_list = copy.copy(original_list)
copied_list.append(4)
print("original_list:", original_list)
print("copied_list:", copied_list)
출력:
original_list: [1, 2, 3]
copied_list: [1, 2, 3, 4]
이 예제에서 copied_list는 original_list의 복사본인 새 객체입니다. copied_list에 4를 추가하면 original_list는 변경되지 않습니다.
중첩된 가변 객체의 경우 copy 함수를 사용하는 것은 작동하지 않습니다.
## 여기에 복사 예시를 넣으세요
original_nested_list = [[1, 2], [3, 4]]
copied_nested_list = copy.copy(original_nested_list)
copied_nested_list[0].append(5)
print("original_nested_list:", original_nested_list)
print("copied_nested_list:", copied_nested_list)
출력:
original_nested_list: [[1, 2, 5], [3, 4]]
copied_nested_list: [[1, 2, 5], [3, 4]]
copied_nested_list에 5를 추가하면 original_nested_list도 5를 추가하는 것을 볼 수 있습니다. 따라서 대신 deepcopy 함수를 사용해야 합니다.
## 여기에 deepcopy 예시를 넣으세요
original_nested_list = [[1, 2], [3, 4]]
deep_copied_list = copy.deepcopy(original_nested_list)
deep_copied_list[0].append(5)
print("original_nested_list:", original_nested_list)
print("deep_copied_list:", deep_copied_list)
출력:
original_nested_list: [[1, 2], [3, 4]]
deep_copied_list: [[1, 2, 5], [3, 4]]
이 예제에서 deepcopy 함수는 original_nested_list를 재귀적으로 복사하는 반면, copy 함수는 original_nested_list의 첫 번째 레벨 데이터에 대한 참조 객체를 생성합니다.
이 Python 프로그래밍 튜토리얼에서는 Python 할당과 참조의 기본 사항을 다루었습니다. Python 이 할당을 처리하는 방법, 참조를 생성하는 방법, 가변 및 불변 객체로 작업하는 방법을 살펴보았습니다. 이러한 개념을 이해함으로써 효율적이고 정확한 Python 코드를 작성하는 데 더 능숙해질 것입니다.