Python 에서 변수가 None 인지 확인하는 방법

PythonBeginner
지금 연습하기

소개

이 랩에서는 Python 에서 변수가 None인지 확인하는 방법을 배우게 됩니다. 랩은 값의 부재를 나타내는 특수한 상수인 None 값에 대한 설명으로 시작합니다. 값을 반환하지 않는 함수에서 None이 어떻게 반환되는지, 변수에 None을 할당하는 방법, 그리고 함수에서 None을 기본 인수로 사용하는 방법을 이해하기 위해 Python 스크립트를 생성할 것입니다.

그런 다음, 이 랩에서는 is 연산자를 사용하여 None을 특별히 확인하는 방법을 안내하며, 0, False, 빈 문자열과 같은 다른 falsy 값과 구별합니다. 이를 통해 Python 코드에서 변수가 실제로 None 값을 가지고 있는지 정확하게 식별할 수 있습니다.

None 값 이해하기

이 단계에서는 Python 의 None 값에 대해 배우게 됩니다. None은 Python 에서 값의 부재 또는 null 값을 나타내는 특수한 상수입니다. 변수에 값이 할당되지 않았거나 함수가 값을 반환하지 않는다는 것을 나타내는 데 자주 사용됩니다.

VS Code 편집기를 사용하여 ~/project 디렉토리에 none_example.py라는 Python 파일을 생성하는 것으로 시작해 보겠습니다.

## ~/project/none_example.py
def greet(name):
    if name:
        return "Hello, " + name
    else:
        return None

result = greet("Alice")
print(result)

result = greet("")
print(result)

이 코드에서:

  • name을 입력으로 받는 greet 함수를 정의합니다.
  • name이 비어 있지 않으면 함수는 인사말 문자열을 반환합니다.
  • name이 비어 있으면 함수는 None을 반환합니다.
  • "Alice"와 빈 문자열 ""로 greet 함수를 호출하고 결과를 출력합니다.

이제 Python 스크립트를 실행합니다.

python ~/project/none_example.py

다음과 같은 출력을 볼 수 있습니다.

Hello, Alice
None

보시다시피, "Alice"로 greet를 호출하면 "Hello, Alice"를 반환합니다. 빈 문자열로 호출하면 None을 반환하며, 이는 콘솔에 출력됩니다.

None은 0, False 또는 빈 문자열과 동일하지 않습니다. 이는 값의 부재를 나타내는 별개의 값입니다.

변수에 None을 할당할 수 있습니다.

## ~/project/none_example2.py
x = None
print(x)

스크립트를 실행합니다.

python ~/project/none_example2.py

출력:

None

함수에서 None을 기본 인수 값으로 사용할 수도 있습니다.

## ~/project/none_example3.py
def my_function(arg=None):
    if arg is None:
        print("No argument was passed.")
    else:
        print("Argument:", arg)

my_function()
my_function("Hello")

스크립트를 실행합니다.

python ~/project/none_example3.py

출력:

No argument was passed.
Argument: Hello

이 예제에서 my_function을 호출할 때 인수가 제공되지 않으면 arg는 기본적으로 None이 됩니다.

is 연산자를 사용하여 None 확인하기

이 단계에서는 is 연산자를 사용하여 변수가 None인지 확인하는 방법을 배우게 됩니다. Python 에서 is 연산자는 두 변수가 메모리에서 동일한 객체를 참조하는지 테스트하는 데 사용됩니다. 이는 두 변수가 동일한 값을 갖는지 확인하는 == 연산자와 다릅니다. None을 처리할 때는 is 연산자를 사용하는 것이 가장 좋습니다. None은 싱글톤 객체 (singleton object) 이므로 메모리에 None의 인스턴스가 하나만 존재하기 때문입니다.

VS Code 편집기를 사용하여 ~/project 디렉토리에 is_none_example.py라는 Python 파일을 생성해 보겠습니다.

## ~/project/is_none_example.py
def check_none(value):
    if value is None:
        print("The value is None")
    else:
        print("The value is not None")

x = None
check_none(x)

y = "Hello"
check_none(y)

이 코드에서:

  • value를 입력으로 받는 check_none 함수를 정의합니다.
  • is 연산자를 사용하여 valueNone인지 확인합니다.
  • valueNone이면 "The value is None"을 출력합니다.
  • 그렇지 않으면 "The value is not None"을 출력합니다.
  • 차이점을 보여주기 위해 None과 "Hello"로 check_none 함수를 호출합니다.

이제 Python 스크립트를 실행합니다.

python ~/project/is_none_example.py

다음과 같은 출력을 볼 수 있습니다.

The value is None
The value is not None

보시다시피, is 연산자는 변수가 None일 때 올바르게 식별합니다.

None을 확인할 때는 == None 대신 is None을 사용하는 것이 중요합니다. == None이 어떤 경우에는 작동할 수 있지만, 특히 == 연산자를 재정의하는 사용자 정의 객체를 처리할 때는 모든 상황에서 작동한다고 보장할 수 없습니다. is None을 사용하는 것이 None을 확인하는 권장되고 가장 신뢰할 수 있는 방법입니다.

이를 설명하기 위한 또 다른 예는 다음과 같습니다.

## ~/project/is_none_example2.py
class MyClass:
    def __eq__(self, other):
        return True  ## Always return True for equality

obj = MyClass()
print(obj == None)  ## Might return True due to the overridden __eq__ method
print(obj is None)  ## Always returns False because obj is not None

스크립트를 실행합니다.

python ~/project/is_none_example2.py

출력:

True
False

이 예제는 객체의 __eq__ 메서드가 재정의된 경우 == None을 사용하면 예상치 못한 결과가 발생할 수 있음을 보여줍니다. 그러나 is None 검사는 객체가 실제로 None인지 항상 올바르게 식별합니다.

None 과 다른 Falsy 값 구분하기

이 단계에서는 Python 에서 None을 다른 falsy 값과 구별하는 방법을 배우게 됩니다. Python 에서 여러 값은 "falsy"로 간주되며, 이는 부울 컨텍스트에서 False로 평가됨을 의미합니다. 여기에는 False, 0, 0.0, 빈 문자열 (""), 빈 리스트 ([]), 빈 튜플 (()), 빈 딕셔너리 ({}), 그리고 None이 포함됩니다.

None이 falsy 이긴 하지만, 이러한 다른 값과 동일하지 않다는 것을 이해하는 것이 중요합니다. None을 특별히 확인할 때는 is 연산자를 사용하는 것이 중요합니다. 이는 None을 다른 falsy 값과 구별하기 때문입니다.

VS Code 편집기를 사용하여 ~/project 디렉토리에 falsy_values.py라는 Python 파일을 생성해 보겠습니다.

## ~/project/falsy_values.py
def check_falsy(value):
    if value:
        print(f"{value!r} is considered True")
    else:
        print(f"{value!r} is considered False")

check_falsy(None)
check_falsy(False)
check_falsy(0)
check_falsy("")
check_falsy([])

print("\nChecking with 'is None':")

def check_none(value):
    if value is None:
        print(f"{value!r} is None")
    else:
        print(f"{value!r} is not None")

check_none(None)
check_none(False)
check_none(0)
check_none("")
check_none([])

이 코드에서:

  • value를 입력으로 받아 부울 컨텍스트에서 진실성을 확인하는 check_falsy 함수를 정의합니다.
  • 그런 다음 is None 연산자를 사용하여 값이 None인지 특별히 확인하는 check_none 함수를 정의합니다.
  • 차이점을 보여주기 위해 None, False, 0, "", 및 []로 두 함수를 모두 호출합니다.

이제 Python 스크립트를 실행합니다.

python ~/project/falsy_values.py

다음과 같은 출력을 볼 수 있습니다.

None is considered False
False is considered False
0 is considered False
'' is considered False
[] is considered False

Checking with 'is None':
None is None
False is not None
0 is not None
'' is not None
[] is not None

이 출력은 모든 값이 부울 컨텍스트에서 falsy 로 간주되지만, is None 연산자를 사용할 때는 NoneNone으로 식별됨을 명확하게 보여줍니다.

is None을 사용하면 단순히 False로 평가되는 모든 값이 아닌, 값의 부재를 특별히 확인하게 됩니다. 이러한 구별은 견고하고 정확한 Python 코드를 작성하는 데 중요합니다.

요약

이 랩에서는 값의 부재를 나타내는 Python 의 None 값에 대해 배웠습니다. 값을 사용할 수 없을 때 함수가 None을 반환하는 방법과 변수에 None을 할당하는 방법을 살펴보았습니다.

또한, 함수에서 None을 기본 인자 값으로 사용하여 인자가 제공되지 않을 때 함수가 다르게 동작하도록 하는 방법을 탐구했습니다. 이 랩에서는 실용적인 예제와 코드 조각을 통해 이러한 개념을 시연했습니다.