programing

파이썬에서 "if someobj == 없음:"보다 "if someobj:"가 더 나은 이유는 무엇입니까?

kingscode 2023. 7. 20. 22:45
반응형

파이썬에서 "if someobj == 없음:"보다 "if someobj:"가 더 나은 이유는 무엇입니까?

다음과 같은 코드의 예를 몇 가지 보았습니다.

if not someobj:
    #do something

하지만 왜 하지 않는지 궁금합니다.

if someobj == None:
    #do something

차이가 있습니까?하나가 다른 하나보다 유리합니까?

번째를 첫번테은서에 Python객체다로 하려고 합니다.bool값(이미 하나가 아닌 경우).대략적으로, 우리는 목적을 묻고 있습니다: 당신은 의미가 있나요, 아닌가요?이 작업은 다음 알고리즘을 사용하여 수행됩니다.

  1. 그 가 다있경는우이음개체에▁a경우▁the▁has를 가지고 ,__nonzero__특수한 방법(숫자 내장형과 동일)int그리고.float이합니다.), 이메서호출니다합를드▁),다니.다음 중 하나를 반환해야 합니다.bool되는 값 으사값는또는되용로적접직▁which▁value또는값▁an.int 되는 값False0과 같다면,

  2. 그렇지 않은 경우, 객체에 다음이 있을 경우__len__특수 방법(용기 내장형과 마찬가지로),list,dict,set,tuple하여 이을 ...), 컨이너를고이호메를출니합다드서려여하테▁this,▁...▁method▁calls라고 부릅니다.False빈 경우(길이가 0).

  3. 않으면,그는 그지않개다같간주이다됩니음과체가렇으면으로 됩니다.True None그런경우에, 그은고니다려됩것다로 간주됩니다.False.

두 번째 테스트에서 객체는 다음과 동일하게 비교됩니다.None여기서 우리는 대상에게 " 다른 값과 같습니까?"라고 묻고 있습니다.이 작업은 다음 알고리즘을 사용하여 수행됩니다.

  1. 그 가 다있경는우이음개체에▁a경우▁the▁has를 가지고 ,__eq__이 메드서, 호고반값환다변은으로 됩니다.bool을 매기고 ▁of▁the▁value의 결과를 하는 데 됩니다.if.

  2. 그렇지 않은 경우, 객체에 다음이 있을 경우__cmp__메서드라고 합니다.는 이함는다반합니다야해환을 해야 합니다.int두 개체의 순서를 나타냅니다(-1한다면self < other,0한다면self == other,+1한다면self > other).

  3. 그렇지 않으면 개체의 ID(즉, 개체)가 비교됩니다.그들은 동일한 물체에 대한 참조이며, 테스트할 수 있습니다.is연산자)를 선택합니다.

다음을 사용하여 테스트할 수 있습니다.is교환입니다.우리는 대상에게 "당신이 이 특정 대상입니까?"라고 물을 것입니다.

첫 값을 하고, 성질의 두 두 ...)를 때 을 위한 하고, 센티넬 값 value)을할 때만 합니다. 센티널 값을 사용할 때만 동일성을 확인할 것을 권장합니다.None예를 들어 멤버 필드에 대해 초기화되지 않음을 의미합니다.getattr 는또.__getitem__방법)을 선택합니다.

요약하면 다음과 같습니다.

>>> class A(object):
...    def __repr__(self):
...        return 'A()'
...    def __nonzero__(self):
...        return False

>>> class B(object):
...    def __repr__(self):
...        return 'B()'
...    def __len__(self):
...        return 0

>>> class C(object):
...    def __repr__(self):
...        return 'C()'
...    def __cmp__(self, other):
...        return 0

>>> class D(object):
...    def __repr__(self):
...        return 'D()'
...    def __eq__(self, other):
...        return True

>>> for obj in ['', (), [], {}, 0, 0., A(), B(), C(), D(), None]:
...     print '%4s: bool(obj) -> %5s, obj == None -> %5s, obj is None -> %5s' % \
...         (repr(obj), bool(obj), obj == None, obj is None)
  '': bool(obj) -> False, obj == None -> False, obj is None -> False
  (): bool(obj) -> False, obj == None -> False, obj is None -> False
  []: bool(obj) -> False, obj == None -> False, obj is None -> False
  {}: bool(obj) -> False, obj == None -> False, obj is None -> False
   0: bool(obj) -> False, obj == None -> False, obj is None -> False
 0.0: bool(obj) -> False, obj == None -> False, obj is None -> False
 A(): bool(obj) -> False, obj == None -> False, obj is None -> False
 B(): bool(obj) -> False, obj == None -> False, obj is None -> False
 C(): bool(obj) ->  True, obj == None ->  True, obj is None -> False
 D(): bool(obj) ->  True, obj == None ->  True, obj is None -> False
None: bool(obj) -> False, obj == None ->  True, obj is None ->  True

이것들은 사실 둘 다 형편없는 관행입니다.옛날에는 None과 False를 아무렇지 않게 유사하게 취급해도 괜찮다고 생각했습니다.그러나 Python 2.2 이후로는 이것이 최선의 정책은 아닙니다.

번째로를 할 때, 이신할때.if x또는if not x테스트의 종류, 파이썬은 암시적으로 변환해야 합니다.x부로울규. 에대칙의 .bool함수는 거짓인 많은 것들을 설명하고, 다른 모든 것들은 참입니다.만약 x의 값이 처음부터 제대로 불리지 않았다면, 이 암묵적인 변환은 실제로 사물을 표현하는 가장 명확한 방법이 아닙니다.

Python 2.2 이전에는 Bool 기능이 없었기 때문에 더 명확하지 않았습니다.

둘째로, 당신은 정말로 테스트를 해서는 안 됩니다.== None당신은 야합다니해를 사용해야 .is None그리고.is not None.

PEP 8, Python Code에 대한 스타일 가이드를 참조하십시오.

- Comparisons to singletons like None should always be done with
  'is' or 'is not', never the equality operators.

  Also, beware of writing "if x" when you really mean "if x is not None"
  -- e.g. when testing whether a variable or argument that defaults to
  None was set to some other value.  The other value might have a type
  (such as a container) that could be false in a boolean context!

싱글톤은 몇 개입니까?다섯 개:None,True,False,NotImplemented그리고.Ellipsis당신은 정말로 사용할 가능성이 낮으니까요.NotImplemented또는Ellipsis그리고 당신은 절대 말하지 않을 것입니다.if x is True 간단하게 (단순히히단▁simply▁(if x더 하다), 훨씬 더명함확오할당은직테만것트다니입스신▁ever다▁you▁test▁is것할니'입.None.

ㅠㅠNone거짓으로 간주되는 것은 이뿐만이 아닙니다.

if not False:
    print "False is false."
if not 0:
    print "0 is false."
if not []:
    print "An empty list is false."
if not ():
    print "An empty tuple is false."
if not {}:
    print "An empty dict is false."
if not "":
    print "An empty string is false."

False,0,(),[],{}그리고."" 와모다릅다니두다▁from▁all와 다릅니다.None그래서 당신의 코드 스니펫은 동등하지 않습니다.

또한 다음 사항을 고려하십시오.

>>> False == 0
True
>>> False == ()
False

if object:동일성 검사가 아닙니다.0,(),[],None,{}은 모두 서로 다르지만 모두 False로 평가됩니다.

이것은 다음과 같은 단락 표현 뒤에 숨겨진 "마법"입니다.

foo = bar and spam or eggs

이는 다음의 약어입니다.

if bar:
    foo = spam
else:
    foo = eggs

당신은 정말로 다음과 같이 써야 합니다.

foo = spam if bar else egg

PEP 8 - 없음을 테스트하는 경우 is 또는 not사용할 것을 권장하는 Python Code용 스타일 가이드

- Comparisons to singletons like None should always be done with
  'is' or 'is not', never the equality operators.

반면에 없음 이상을 검정하는 경우에는 부울 연산자를 사용해야 합니다.

묻는다면

if not spam:
    print "Sorry. No SPAM."

__nonzero__ 메서드의 스팸이 호출됩니다.Python 매뉴얼에서:

__nonzero__(self) True 값 테스트를 구현하기 위해 호출되며, 기본 제공 작업 bool();은(는) False 또는 True 또는 해당 정수 등가 0 또는 1을 반환해야 합니다.이 메서드가 정의되지 않은 경우 __len__()가 호출됩니다(아래 참조).클래스가 __len__() 또는 __nonzero__()를 정의하지 않으면 모든 인스턴스가 참으로 간주됩니다.

묻는다면

if spam == None:
    print "Sorry. No SPAM here either."

__eq__ 메서드의 스팸은 없음 인수로 호출됩니다.

사용자 지정 가능성에 대한 자세한 내용은 https://docs.python.org/reference/datamodel.html#basic-customization 에서 Python 설명서를 참조하십시오.

이 두 가지 비교는 서로 다른 용도로 사용됩니다.전자는 어떤 것의 부울 값을 확인하고, 두 번째는 없음 값을 가진 ID를 확인합니다.

한 가지 예로 첫 번째 예는 더 짧고 더 멋져 보입니다.다른 게시물들에 따르면, 당신이 선택하는 것은 당신이 정말로 비교로 무엇을 하고 싶은지에 달려 있습니다.

답은 "그것은 의존한다"입니다.

이 컨텍스트에서 0, ", [] 및 False(목록이 완전하지 않음)가 없음과 동일하다고 생각하는 경우 첫 번째 예제를 사용합니다.

개인적으로 여러 언어에 걸쳐 일관된 접근 방식을 선택했습니다.그렇습니다.if (var)(또는 동등) var가 부울로 선언된 경우에만(또는 그렇게 정의된 경우, C에서는 특정 유형이 없습니다). 이 에 나는심이변앞에붙다입다니음을수들어지▁a▁these▁with다▁prefix붙▁variables▁even▁i니입다음으로 접두사를 붙이기도 합니다.b(그러므로 그럴 것입니다.bVar실수로 다른 유형을 사용하지 않도록 하기 위해서입니다.
저는 부울에 암묵적으로 캐스팅하는 것을 별로 좋아하지 않습니다. 더 나아가서는 수많은 복잡한 규칙이 있을 때죠.

물론, 사람들은 동의하지 않을 것입니다.몇몇은 더 멀리 갑니다, 알겠습니다.if (bVar == true)내 직장의 자바 코드에서 (내 취향에 비해 너무 중복적이다!), 다른 사람들은 너무 많은 압축 구문을 사랑합니다.while (line = getNextLine())(나에게는 너무 애매함).

언급URL : https://stackoverflow.com/questions/100732/why-is-if-not-someobj-better-than-if-someobj-none-in-python

반응형