[python] A와 A가 없음이 아닌 경우 :

사용해도 되나요:

if A:

대신에

if A is not None:

후자는 너무 장황 해 보인다. 차이가 있습니까?



답변

진술

if A:

호출하고 A.__nonzero__()( 특수 메서드 이름 설명서 참조 ) 해당 함수의 반환 값을 사용합니다. 요약은 다음과 같습니다.

object.__nonzero__(self)

진실 가치 테스트 및 기본 제공 작업을 구현하기 위해 호출됩니다 bool(). 반환해야 False하거나 True, 또는 정수 동등 0또는 1. 이 메소드가 정의되지 않은 경우이 메소드가 정의 된 __len__()경우 호출되며 결과가 0이 아닌 경우 오브젝트는 참으로 간주됩니다. 클래스가 __len__()nor를 정의하지 않으면 __nonzero__()모든 인스턴스가 true로 간주됩니다.

반면에

if A is not None:

비교 만을 기준 A으로 None그 동일한인지 여부를 확인한다.


답변

PEP8 로 작성된 :

  • 없음 과 같은 싱글 톤과의 비교 는 항상 등호 연산자가 아닌 ‘is’또는 ‘is not’으로 수행해야합니다 .

    또한 “x가 None이 아닌 경우”를 의미 할 때 “if x”를 쓰지 않도록주의하십시오.
    예를 들어 기본값이 None 인 변수 또는 인수가 다른 값으로 설정되어 있는지 테스트 할 때. 다른 값에는 부울 컨텍스트에서 false 일 수있는 유형 (예 : 컨테이너)이있을 수 있습니다!


답변

if x: #x is treated True except for all empty data types [],{},(),'',0 False, and None

그래서 그것은 같지 않습니다

if x is not None # which works only on None


답변

적절한 결과가 없으면 많은 함수가 None을 반환합니다. 예를 들어, .first()결과에 행이 없으면 SQLAlchemy 쿼리의 메서드는 None을 반환합니다. 0을 리턴 할 수있는 값을 선택하고 실제로 0인지 또는 쿼리에 결과가 전혀 없는지 알아야한다고 가정하십시오.

일반적인 관용구는 함수 또는 메서드의 선택적 인수에 기본값 None을 부여한 다음 해당 값이 None인지 테스트하여 값이 지정되었는지 확인하는 것입니다. 예를 들면 다음과 같습니다.

def spam(eggs=None):
    if eggs is None:
        eggs = retrievefromconfigfile()

그것을 다음과 비교하십시오 :

def spam(eggs=None):
    if not eggs:
        eggs = retrievefromconfigfile()

전화 할 경우 후자에 무슨 일이 spam(0)spam([])? 함수는 (잘못된) 값을 전달하지 않았 음을 감지 eggs하고 기본값을 계산합니다. 아마 당신이 원하는 것이 아닐 것입니다.

또는 “주어진 계정에 대한 거래 목록을 반환”과 같은 방법을 상상해보십시오. 계정이 없으면 None을 반환 할 수 있습니다. 이것은 비어있는 목록을 반환하는 것과 다릅니다 ( “이 계정은 존재하지만 기록 된 트랜잭션이 없음”을 의미 함).

마지막으로 데이터베이스로 돌아갑니다. NULL과 빈 문자열 사이에는 큰 차이가 있습니다. 빈 문자열은 일반적으로 “여기에 값이 있으며 그 값은 전혀 없습니다”라고 말합니다. NULL은 “이 값을 입력하지 않았습니다”라고 말합니다.

각각의 경우에을 사용하려고합니다 if A is None. “False로 캐스트되는 모든 값”뿐만 아니라 특정 값 (없음)을 확인하고 있습니다.


답변

그들은 매우 다른 일을 합니다.

아래의 검사 A는 값을 제외하고 무엇이든이있는 경우 False, [], None, ''0. A 의 을 확인합니다 .

if A:

아래는 A가 없음과 다른 객체인지 확인합니다. A와 None 의 참조 (메모리 주소)를 확인하고 비교합니다 .

if A is not None:

업데이트 : 추가 설명

많은 경우 두 사람이 같은 일을하는 것처럼 보이므로 많은 사람들이 서로 바꿔서 사용합니다. 정말 나쁜 생각입니다. 두 사람이 동일한 결과를 얻는 이유는 인턴 또는 다른 것과 같은 인터프리터 / 컴파일러의 최적화로 인해 순수한 우연의 일치 로 여러 번 발생합니다 .

이러한 최적화를 염두에두고 동일한 값의 정수와 문자열은 동일한 메모리 공간을 사용합니다. 아마도 두 개의 개별 문자열이 동일한 것처럼 작동하는 이유를 설명합니다.

> a = 'test'
> b = 'test'
> a is b
True
> a == b
True

다른 것들도 똑같이 동작하지 않습니다 ..

> a = []
> b = []
> a is b
False
> a == b
True

두 목록에는 분명히 자신의 기억이 있습니다. 놀랍게도 튜플은 문자열처럼 행동합니다.

> a = ()
> b = ()
> a is b
True
> a == b
True

아마도 이것은 튜플이 변경되지 않도록 보장되기 때문에 동일한 메모리를 재사용하는 것이 좋습니다.

결론은 우연의 일치에 의존수 없다는 것 입니다. 오리처럼 because다고해서 오리라는 의미는 아닙니다. 사용 is하고 ==당신이 정말로 확인하려는 작업에 따라 달라집니다. is우리가 종종 넘어가는 산문과 같은 읽기 때문에 이러한 것들을 디버깅하기 가 어려울 수 있습니다 .


답변

if A: A가 0, False, 빈 문자열, 빈 목록 또는 없음 인 경우 false로 표시되어 원하지 않는 결과가 발생할 수 있습니다.


답변

내가 본 대부분의 가이드는 당신이 사용해야한다고 제안합니다.

만약:

더 구체적인 이유가 없다면

약간의 차이가 있습니다. 비어있는 목록 또는 0과 같이 False를 반환하는 None 이외의 값이 있으므로 실제로 테스트 대상이 무엇인지 생각해보십시오.