HOWTO · Python
파이썬에서 값 없이 변수를 선언하는 방법
Python이 바인딩되지 않은 이름, `None` 자리 표시자, 할당 없는 어노테이션, 빈 문자열 또는 리스트 값을 어떻게 다루는지 알아보세요.
이 페이지의 내용
나중에 제공할 값을 위해 변수를 준비하려면, 자리 표시자로 None을 할당하세요. Python은 할당이 실행될 때만 이름을 바인딩합니다. 이름을 단순히 언급하거나 어노테이션을 작성하는 것만으로는 런타임 값이 주어지지 않습니다. 할당 없이 타입을 기록해야 할 때는 변수 어노테이션을 사용하고, 시작 값으로 그것을 원할 때는 빈 문자열이나 리스트를 할당하세요.
Python이 할당된 값이 없는 변수를 다루는 방법
Python에서 할당은 이름과 객체 사이에 바인딩을 만듭니다. 현재 범위에서 할당되지 않은 이름은 바인딩되지 않은 것입니다. 그것을 읽으면 NameError가 발생합니다. 그것은 특별한 “없음” 값을 담고 있는 변수가 아닙니다. 이 구분은 나중에 제공될 데이터를 어떻게 표현할지 선택할 때 중요합니다.
아래의 옵션들은 서로 다른 상태를 만듭니다. None은 할당된 자리 표시자이고, 어노테이션은 값을 할당하지 않고 타입 정보를 기록하며, 빈 문자열이나 리스트는 바로 사용할 수 있는 할당된 객체입니다.
자리 표시자로 None 할당하기
이름이 지금 존재해야 하지만 의미 있는 값을 아직 사용할 수 없을 때 None을 할당하세요. None은 부재를 나타내는 Python의 싱글톤 객체입니다. 이를 할당하면 이름이 바인딩되므로, 이름을 바인딩되지 않은 상태로 두는 것과는 다릅니다. is None으로 확인하세요.
세 가지 선택을 비교하려면 이 완전한 예제를 실행하세요.
profile = None
message = ""
items = []
if profile is None:
profile = {"name": "Ada"}
message += "Hello"
items.append("first")
print(profile["name"])
print(message)
print(items)
확인 후, profile은 딕셔너리를 참조합니다. None 매개변수 기본값은 제공된 값이 기본값을 대체하므로, 생략된 인수와 제공된 None이 아닌 값을 구분합니다. 생략과 명시적인 None을 구분할 수는 없습니다. 이러한 호출을 다르게 처리해야 할 때는 고유한 센티널 객체를 기본값으로 사용하세요.
값을 할당하지 않고 변수 어노테이션 사용하기
변수 어노테이션은 런타임 값을 이름에 바인딩하지 않고 의도한 타입을 기록할 수 있습니다.
name: str
이것은 할당이 아니라 어노테이션입니다. 어노테이션은 이를 포함하는 모듈이나 클래스의 어노테이션 데이터를 통해 사용할 수 있을지 모르지만, 할당하기 전에 name을 읽으면 여전히 NameError가 발생합니다. 이후 코드가 값을 읽어야 한다면, 먼저 name = "Ada"와 같이 값을 할당하세요. 의도한 타입을 문서화하는 것이 유용하고 할당은 다른 곳에서 이루어져야 할 때 어노테이션 전용 구문을 사용하세요.
빈 값이 의도된 경우 빈 문자열이나 리스트 사용하기
빈 값이 이미 작업에 맞는 올바른 시작 값일 때 이를 할당하세요. 빈 문자열은 여전히 문자열이고, 빈 리스트는 여전히 리스트입니다. 어느 것도 바인딩되지 않은 이름이나 None 자리 표시자를 나타내지 않습니다.
위의 예제는 message를 빈 문자열로, items를 빈 리스트로 시작하고, 이후 내용을 추가합니다. 저장하려는 데이터에 맞는 타입을 선택하세요. 리스트는 나중에 append()나 extend()와 같은 메서드로 채울 수 있습니다.
의도에 맞는 형식 선택하기
- 부재가 의미 있고 이름이 이미 바인딩되어야 할 때는
None을 사용하세요. 자리 표시자를 대체하거나 사용하기 전에is None으로 확인하세요. - 의도한 타입을 기록해야 하지만 그 시점에 값을 할당하고 싶지 않을 때는
name: str와 같은 어노테이션을 사용하세요. 이는 런타임에 이름을 읽을 수 있게 만들지 않습니다. - 빈 문자열이나 컬렉션이 코드에 필요한 실제 초기 값일 때는
""또는[]를 사용하세요.
읽기에서 NameError가 발생하면, 먼저 그 범위에서 할당이 실행되었는지 확인하세요. 자리 표시자가 필요하면 None을 할당하거나, 코드가 사용할 값을 초기화하세요. 어노테이션 전용 구문을 런타임 초기화의 대체물로 사용하지 마세요.