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 또는 None이면 false로 표시되어 원하지 않는 결과가 발생할 수 있습니다.
Most guides I've seen suggest that you should use
if A:
unless you have a reason to be more specific.
There are some slight differences. There are values other than None that return False, for example empty lists, or 0, so have a think about what it is you're really testing for.
None is a special value in Python which usually designates an uninitialized variable. To test whether A does not have this particular value you use:
if A is not None
Falsey values are a special class of objects in Python (e.g. false, []). To test whether A is falsey use:
if not A
Thus, the two expressions are not the same And you'd better not treat them as synonyms.
P.S. None is also falsey, so the first expression implies the second. But the second covers other falsey values besides None. Now... if you can be sure that you can't have other falsey values besides None in A, then you can replace the first expression with the second.
It depends on the context.
I use if A:
when I'm expecting A
to be some sort of collection, and I only want to execute the block if the collection isn't empty. This allows the caller to pass any well-behaved collection, empty or not, and have it do what I expect. It also allows None
and False
to suppress execution of the block, which is occasionally convenient to calling code.
OTOH, if I expect A
to be some completely arbitrary object but it could have been defaulted to None
, then I always use if A is not None
, as calling code could have deliberately passed a reference to an empty collection, empty string, or a 0-valued numeric type, or boolean False
, or some class instance that happens to be false in boolean context.
And on the other other hand, if I expect A
to be some more-specific thing (e.g. instance of a class I'm going to call methods of), but it could have been defaulted to None
, and I consider default boolean conversion to be a property of the class I don't mind enforcing on all subclasses, then I'll just use if A:
to save my fingers the terrible burden of typing an extra 12 characters.
The former is more Pythonic (better ideomatic code), but will not execute the block if A is False (not None).
I created a file called test.py
and ran it on the interpreter. You may change what you want to, to test for sure how things is going on behind the scenes.
import dis
def func1():
matchesIterator = None
if matchesIterator:
print( "On if." );
def func2():
matchesIterator = None
if matchesIterator is not None:
print( "On if." );
print( "\nFunction 1" );
dis.dis(func1)
print( "\nFunction 2" );
dis.dis(func2)
This is the assembler difference:
Source:
>>> import importlib
>>> reload( test )
Function 1
6 0 LOAD_CONST 0 (None)
3 STORE_FAST 0 (matchesIterator)
8 6 LOAD_FAST 0 (matchesIterator)
9 POP_JUMP_IF_FALSE 20
10 12 LOAD_CONST 1 ('On if.')
15 PRINT_ITEM
16 PRINT_NEWLINE
17 JUMP_FORWARD 0 (to 20)
>> 20 LOAD_CONST 0 (None)
23 RETURN_VALUE
Function 2
14 0 LOAD_CONST 0 (None)
3 STORE_FAST 0 (matchesIterator)
16 6 LOAD_FAST 0 (matchesIterator)
9 LOAD_CONST 0 (None)
12 COMPARE_OP 9 (is not)
15 POP_JUMP_IF_FALSE 26
18 18 LOAD_CONST 1 ('On if.')
21 PRINT_ITEM
22 PRINT_NEWLINE
23 JUMP_FORWARD 0 (to 26)
>> 26 LOAD_CONST 0 (None)
29 RETURN_VALUE
<module 'test' from 'test.py'>
python >= 2.6,
if we write such as
if A:
will generate warning as,
FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead.
So we can use
if A is not None:
참고URL : https://stackoverflow.com/questions/7816363/if-a-vs-if-a-is-not-none
'development' 카테고리의 다른 글
Visual Studio 2012-Intellisense가 때때로 사라지거나 손상됨 (0) | 2020.06.28 |
---|---|
OS X에서 터미널을 사용하여 디렉토리를 이동하는 방법 (0) | 2020.06.28 |
LaTeX : 텍스트 범위에서 줄 바꿈 방지 (0) | 2020.06.28 |
Java 람다는 둘 이상의 매개 변수를 가질 수 있습니까? (0) | 2020.06.27 |
Android M 권한 : shouldShowRequestPermissionRationale () 함수 사용에 혼란 (0) | 2020.06.27 |