A와 A가 없음인 경우:
사용방법:
if A:
대신
if A is not None:
후자는 너무 장황해 보인다.차이가 있나요?
스테이트먼트
if A:
를 호출합니다.A.__bool__()
(특수 메서드 이름 매뉴얼 참조), 호출된__nonzero__
해당 함수의 반환값을 사용합니다.을 사용하다
object.__bool__(self)
테스트 및 됩니다.
bool()
는 돌아올 이다.False
★★★★★★★★★★★★★★★★★」True
되어 있지 않은 이 메서드는 정의되어 있지 않습니다.__len__()
정의된 경우 호출되며, 결과가 0이 아닌 경우 개체는 true로 간주됩니다.가 「」를 정의하지__len__()
않다__bool__()
사실
반면에,
if A is not None:
참조만 비교합니다.A
None
츠키노
PEP8에 기재된 바와 같이:
없음과 같은 싱글톤과 비교하려면 항상 'is' 또는 'is not'를 사용해야 하며 등식 연산자는 사용하지 않아야 합니다.
또한 "만약 x가 "없음"이 아닌 경우(기본값이 "없음"인 변수 또는 인수가 다른 값으로 설정되었는지 테스트하는 경우 등)에는 "만약 x"를 쓰지 않도록 주의하십시오.다른 값에는 부울 컨텍스트에서 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
많은 함수는 적절한 결과가 없으면 없음을 반환합니다.들어 SQL 쿼리의 Chemy는.first()
method에 경우 합니다.이 있는 전혀 를 알 합니다.
일반적인 관용구는 함수 또는 메서드의 옵션인수에 기본값인 None을 지정한 후 해당 값이 None인지 테스트하여 지정되었는지 확인하는 것입니다.예를 들어 다음과 같습니다.
def spam(eggs=None):
if eggs is None:
eggs = retrievefromconfigfile()
비교:
def spam(eggs=None):
if not eggs:
eggs = retrievefromconfigfile()
, 「 」 「 」 「 」 「 」로 전화하면 ?spam(0)
★★★★★★★★★★★★★★★★★」spam([])
음음음 음음 for 잘 for 잘 for 잘 for 잘 for ? for ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 。eggs
기본값을 계산합니다.그건 네가 원하는 게 아닐 거야
또는 "특정 계정에 대한 거래 목록 반환"과 같은 방법을 상상해 보십시오.계정이 존재하지 않으면 None을 반환할 수 있습니다.이것은 빈 목록을 반환하는 것과는 다릅니다(즉, "이 계정은 존재하지만 트랜잭션은 기록되지 않았습니다.").
마지막으로 데이터베이스 관련 사항으로 돌아갑니다.NULL과 빈 문자열 사이에는 큰 차이가 있습니다.빈 문자열은 일반적으로 "여기에 값이 있고, 그 값은 전혀 없습니다."라고 말합니다.NULL은 "이 값이 입력되지 않았습니다."라고 말합니다.
때는 다 같이 쓰는 게 것 if A is None
특정 값 확인 - 없음 - 단순히 "False에 캐스팅되는 모든 값"이 아닙니다.
그들은 매우 다른 일을 한다.
값 "A" 의 것이 합니다.False
,[]
,None
,''
★★★★★★★★★★★★★★★★★」0
A의 값을 확인합니다.
if A:
아래에서는 A가 없음과 다른 개체인지 확인합니다.A와 없음의 참조(메모리 주소)를 확인하고 비교합니다.
if A is not None:
업데이트: 상세 설명
여러 번 이 둘은 같은 일을 하는 것처럼 보여서 많은 사람들이 그것들을 서로 바꿔서 사용한다.인터프리터/컴파일러의 인터프리터/컴파일러의 최적화 등에 의해, 2개의 결과가 같은 경우가 많습니다.
이러한 최적화를 염두에 두고 동일한 값의 정수와 문자열이 동일한 메모리 공간을 사용하게 됩니다.그래서 두 개의 개별 문자열이 같은 것처럼 동작하는 이유가 설명될 수 있습니다.
> 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
이는 아마도 튜플이 변경되지 않음을 보증하기 때문에 동일한 메모리를 재사용하는 것이 타당하기 때문일 것입니다.
이는 어떤 비교 연산자를 사용하는지 특히 주의해야 함을 나타냅니다.is
★★★★★★★★★★★★★★★★★」==
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 수 .is
우리가 종종 대충 훑어보는 산문처럼 읽힌다.
제가 본 가이드의 대부분은 이 가이드북을 사용하는 것이 좋다고 제안합니다.
A:
좀 더 구체적인 이유가 없다면요
약간의 차이가 있습니다.[None] 이외의 값이 False를 반환하는 경우(예: 빈 목록 또는 0)가 있습니다.따라서 실제로 테스트하는 대상을 생각해 보십시오.
if A:
[ A ] 0 、 [ False ] 、 [ None ] 、 [ False ]를 선택합니다.이는 바람직하지 않은 결과를 초래할 수 있습니다.
None은 보통 초기화되지 않은 변수를 지정하는 Python의 특별한 값입니다.A에 사용하는 특정 값이 없는지 테스트하려면 다음 절차를 따릅니다.
if A is not None
falsey 값은 Python에서 개체의 특별한 클래스입니다(예: false, []).A의 잘못된 사용 여부를 테스트하려면:
if not A
그래서 두 표현은 같지 않고 동의어로 취급하지 않는 것이 좋습니다.
추신: 없음도 거짓이기 때문에 첫 번째 표현은 두 번째 표현입니다.그러나 두 번째는 없음 이외의 거짓 값을 포함합니다.이제... A에서 없음 이외의 거짓 값을 사용할 수 없는 경우 첫 번째 식을 두 번째 식으로 바꿀 수 있습니다.
상황에 따라 다르죠.
용 i i i i를 쓴다.if A:
가 기대했을 때A
컬렉션이 비어 있지 않은 경우에만 블록을 실행합니다.이것에 의해, 발신자는, 비어 있든 없든, 정상적으로 동작하는 수집을 건네줄 수 있어 내가 기대하는 대로 실행할 수 있습니다., 「」도 사용할 수 있습니다.None
★★★★★★★★★★★★★★★★★」False
블록의 실행을 억제합니다.이것은, 경우에 따라서는, 발신 코드에 편리합니다.
, OTOH를 하면 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」A
로는 「이러한 오브젝트」가 되어 가능성이 있습니다.None
, 그럼 저는 항상if A is not None
, 빈 0 참조를 으로 건네거나, 부울 「」, 「」, 「」, 「」, 「」, 「」, 「0」, 「」의 참조를 건네는 경우가 False
또는 부울 컨텍스트에서 false일 가능성이 있는 클래스인스턴스입니다
한편으로, 한다면, 는 그것을 예상한다.A
더 를 들어 의 인스턴스)이 될 수 되어 있을 이 있습니다.None
'부울 변환'을 사용합니다.그냥 사용합니다.if A:
12자를 더 치는 끔찍한 부담을 덜어주기 위해서요
다른 답변들은 모두 좋은 정보를 제공했지만, 저는 이 점을 분명히 해야 한다고 생각합니다.
아니요, 절대 사용하지 마십시오.
if A:
테스트가 필요한 경우:
if A is not None:
첫 번째 버그는 종종 두 번째 버그를 대체하기 위해 작동하지만 첫 번째 버그는 찾기 어려운 일반적인 원인입니다.비록 여러분이 하고 있는 모든 것이 빠른 일회용 코드를 쓰는 것일지라도, 여러분은 버그 코드를 쓰는 습관을 가져서는 안 됩니다.테스트의 정확한 세부 형식을 쓰고 읽을 수 있도록 손가락과 마음을 훈련시키십시오.
if A is not None:
None의 일반적인 용도는 선택적 파라미터 값을 정의하고 변수에 "아직 값이 없음"을 의미하는 기본값 시작 값을 지정하며 "다시 검색된 값이 없음"의 의미를 갖는 함수를 지정하는 것입니다.다음과 같은 함수를 작성할 경우:
def my_func(a_list, obj=None):
if obj: # Trying to test if obj was passed
a_list.append(obj)
# do something with a_list
이 방법은 다음과 같은 많은 실제 용도에 적합합니다.
my_func(user_names, "bob")
그러나 이 중 하나가 발생할 경우:
my_func(user_names, "")
my_func(user_names, [])
my_func(user_names, 0)
그러면 길이가 0인 개체는 목록에 추가되지 않습니다.첫 번째 코드가 작성되었을 때 길이가 0인 사용자 이름은 허용되지 않습니다.쇼트 코드는 정상적으로 동작합니다.그러나 이름을 지정하지 않은 익명 사용자 등의 의미로 빈 문자열을 사용하도록 코드를 수정하려고 하면 이 함수는 갑자기 예상되는 작업을 중지합니다(목록에 nonomous 사용자를 추가).
예를 들어 다음과 같이 사용자가 로그인할 수 있는 시기를 정의하는 논리가 있다고 가정합니다.
new_user = get_user_name()
if user_list_ok(my_func(current_users, new_user)):
# user_list_ok() tests that no more than 10 users can
# log in at the same time, and that no sigle user can
# can log in more than 3 times at once.
# This user is allowed to log in!
log_user_in(new_user)
이것에 의해, 코드에 미묘하고 복잡한 버그가 생깁니다.anonomous 사용자는 테스트 목록에 추가되지 않습니다.따라서 시스템이 10 사용자 제한에 도달해도 테스트에서는 여전히 nonomous 사용자의 로그인을 허용하고 사용자 수를 11로 늘립니다.이로 인해 시스템의 다른 부분에서 최대 10명의 사용자만 필요한 버그가 발생할 수 있습니다.
"var does not value"를 테스트해야 할 경우 보기 흉하고 상세하게 느껴지더라도 항상 더 긴 "is not None" 테스트를 사용해야 합니다.
전자는 더 Phythonic(더 나은 아이디얼 코드)이지만 A가 False(None이 아님)일 경우 블록을 실행하지 않습니다.
는 '.test.py
이치노당신은 당신이 원하는 것을 바꿀 수 있습니다. 이면에서 어떻게 일이 진행되고 있는지 확실히 테스트하기 위해서.
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)
어셈블러의 차이는 다음과 같습니다.
출처:
>>> 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 A:
다음과 같은 경고가 생성됩니다.
미래 경고:이 메서드의 동작은 이후 버전에서 변경될 예정입니다.대신 특정 'len(elem)' 또는 'elem is none' 테스트를 사용하십시오.
그래서 우리가 사용할 수 있다.
if A is not None:
언급URL : https://stackoverflow.com/questions/7816363/if-a-vs-if-a-is-not-none
'programing' 카테고리의 다른 글
임의 조건 함수에 따라 사전을 필터링하려면 어떻게 해야 합니까? (0) | 2022.10.14 |
---|---|
Python에서 공백에 문자열 분할 (0) | 2022.10.14 |
python을 통해 접속할 때 기본 Mysql 연결 타임아웃을 변경하려면 어떻게 해야 합니까? (0) | 2022.10.14 |
Java 드라이버를 사용하여 mongoDB에 마지막으로 삽입된 문서의 ID 가져오기 (0) | 2022.10.14 |
Epoch 시간을 날짜 시간으로 변환하는 중 (0) | 2022.10.05 |