6.1 변수는 참조다
Python에서 변수는 객체에 대한 참조를 나타내며, 변수 자체는 아니다. 즉, Python에서 변수를 생성하면 메모리의 객체에 대한 참조를 생성하는 것이다.
이 언어의 특징은 특히 함수로 객체를 전달하거나 다른 변수에 할당할 때 변수를 다루는 방법에 중요한 영향을 미친다.
변수를 생성하고 값을 할당할 때, Python은 그 값을 위한 메모리의 객체를 할당하고 그 객체에 대한 참조를 변수에 부여한다. 한 변수를 다른 변수에 할당하면, 새 변수는 원래 변수와 동일한 객체를 참조한다. 이는 객체가 변경 가능한 경우, 한 변수를 통해 이루어진 변경 사항이 다른 변수에서도 반영됨을 의미한다.
예시:
a = [1, 2, 3]
b = a
b.append(4)
print(a) # 출력: [1, 2, 3, 4]
우리는 4
를 변수 b
에 추가했지만, 이 숫자는 a
변수에 있는 리스트에도 추가되었어요. 왜냐하면 사실 두 변수 모두 리스트 [1, 2, 3]에 대한 참조일 뿐이에요.
6.2 변경 불가능한 객체
Python에서는 객체가 변경 가능한 객체와 변경 불가능한 객체로 나뉜다. 리스트나 딕셔너리와 같은 변경 가능한 객체는 생성 후에 수정할 수 있다.
문자열이나 숫자와 같은 변경 불가능한 객체는 생성 후 수정할 수 없다. 변경 불가능한 객체를 사용할 때는 변경사항이 새로운 객체를 생성하게 된다.
할당은 결코 객체를 변경하지 않는다:
a = 5 # a는 5 객체에 대한 참조를 저장합니다
b = a # b도 5 객체에 대한 참조를 저장합니다
b = 3 # 이제 b는 3 객체에 대한 참조를 저장합니다
print(a) # 출력: 5
객체는 함수를 호출하여 변경될 수 있다:
a = [1, 2, 3]
b = a
b.append(4)
print(a) # 출력: [1, 2, 3, 4]
하지만 함수가 있는 변경 불가능한 객체도 있어요. 이 함수들은 원본 객체를 변경하지 않고 새로운 결과를 포함하는 새 객체를 반환해요.
name = "Alex"
print(name) # 출력: Alex
name2 = name.lower()
print(name2) # 출력: alex
문자열은 변경 불가능한 객체야. 그리고 메서드를 가지고 있지만, 이 메서드들은 객체를 절대 변경하지 않아 — 대신 항상 새로운 문자열(새 객체)을 반환하지. 원래 객체는 그대로야.
6.3 None 타입 다루기
Python에는 값의 부재를 나타내는 특별한 데이터 타입인 None
이 있어. 주로 빈 변수를 표시하거나 아무 것도 반환하지 않는 함수의 반환값으로 사용되지. None을 이해하는 것은 조건문 컨텍스트와 데이터 처리에서 프로그램 동작을 관리하는 데 중요해.
None 사용의 기본
None
은 NoneType
클래스의 유일한 인스턴스야.
이는 변수가 값을 가지지 않는다는 것을 나타내는데 사용되지. 조건문에서는 None
False
로 평가된다.
a = None
if a:
print("a is True")
else:
print("a is None or False")
None과의 비교
변수에 대한 None 비교는 ==
가 아닌 is
연산자를 사용해 이루어져야 해. is
연산자는 값의 동일성을 확인하지, 값의 동등성을 확인하지 않아.
a = None
if a is None:
print("a is None")
else:
print("a has value")
함수에서의 None
None
은 명시적으로 값을 반환하지 않아야 하는 함수에서 자주 사용돼. 만약 함수가 값을 반환하지 않으면, 암시적으로 None
을 반환해.
def func():
print("This function returns None")
result = func()
print(result) # 출력: None
None과 리스트
None
은 리스트, 튜플 또는 다른 컬렉션에서 특정 위치에 요소가 없음을 나타내기 위해 사용될 수 있어.
my_list = [1, None, 3]
print(my_list) # 출력: [1, None, 3]
GO TO FULL VERSION