programing

부울 ID == 참 대 참

lastmoon 2023. 7. 21. 21:50
반응형

부울 ID == 참 대 참

▁use를 사용하는 것은 표준 입니다.if foo is Noneif foo == None값이 구체적으로 무엇인지 테스트합니다.None.

값이 정확한지 여부를 확인하려면True(단순히 실제와 같은 값이 아님), 사용해야 할 이유가 있습니까?if foo == Trueif foo is TrueCPython(2.x 및 3.x), Jython, PyPy 등과 같은 구현마다 차이가 있습니까?

say 예: sayTrue값과 구별하려는 싱글톤 값으로 사용됩니다.'bar'또는 다른 참과 유사한 값:

if foo is True: # vs foo == True
    ...
elif foo == 'bar':
    ...

를 사용하는 경우가 있습니까?if foo is True과는 다른 결과를 산출할 것입니다.if foo == True?

참고: 파이썬 부울란에 대해 알고 있습니다. x:일 경우 vs x == True, vs x가 True입니다.그러나, 그것은 단지 다음과 같은 것들만 설명합니다.if foo,if foo == True또는if foo is True일반적으로 여부를 결정하는 데 사용되어야 합니다.foo값이 참과 같습니다.


업데이트: PEP 285 » 사양에 따름:

False 및 True 값은 None과 같이 싱글톤이 됩니다.

값이 정확하게 True인지 확인하려면(단순히 True와 같은 값이 아님) foo == True인 경우 foo가 True인 경우가 아니라 foo ▁true True인 경우 사용해야 할 이유가 있습니까?

만약 당신이 그것을 확실히 하고 싶다면.foo 값입니다.True을 사용합니다.is교환입니다.

않은 그지않 유이형경의 foo으로 합니다.__eq__() 값은 와비할때값을반환 true-ish 합니다교와 때합니다.True예상치 못한 결과를 초래할 수도 있습니다.

경험에 비추어 볼 때, 당신은 항상 다음을 사용해야 합니다.is상수가 기본으로 제공됩니다.True,False그리고.None.

CPython(2.x 및 3.x), Jython, PyPy 등과 같은 구현마다 차이가 있습니까?

이론상으로는,is보다 더 빠를 입니다.==는 유형의를 따라야 입니다.__eq__에 구현, 동is개체 ID(예: 메모리 주소)를 직접 비교할 수 있습니다.

저는 다양한 파이썬 구현체의 소스 코드를 외울 수는 없지만, 대부분의 구현체들이 매직 메소드의 존재를 위해 내부 플래그를 사용하여 최적화할 수 있다고 생각하기 때문에 실제로는 속도 차이를 눈치채지 못할 것이라고 생각합니다.

절대로 용안함을 사용하지 .is True팬더와 )와 하여: numpy(리그팬와같파생물은여결하합와고더와:)여▁in결하합물py):

In[1]: import numpy as np
In[2]: a = np.array([1, 2]).any()
In[4]: a is True
Out[4]: False
In[5]: a == True
Out[5]: True

이는 다음과 같이 예상하지 못했습니다.

In[3]: a
Out[3]: True

설명은 다음과 같습니다.

In[6]: type(a)
Out[6]: numpy.bool_

foo가 True인 경우보다 foo == True인 경우를 사용해야 할 이유가 있습니까?

>>> d = True
>>> d is True
True
>>> d = 1
>>> d is True
False
>>> d == True
True
>>> d = 2
>>> d == True
False

:bool의 하위 클래스입니다.int 그 그에밖True 값은 " " " " 입니다.1가 " 참"인지 , 연산자인 "정확히 참"을 .is하지만 그건 정말로 부정적이지 않아요...실제 사용 사례가 무엇인지 여쭤봐도 될까요? - IOW: 왜 차이를 만들고 싶으십니까?True,1아니면 어떤 '진실' 가치라도?

편집: 관련:

를 사용하는 경우가 있습니까?if foo is True과는 다른 결과를 산출할 것입니다.if foo == True?

한 가지 사례가 있는데, 다음과 같습니다.

In [24]: 1 is True
Out[24]: False

In [25]: 1 == True
Out[25]: True

또한 singleton을 sentinel 값으로 사용하려는 경우 객체를 만들 수 있습니다.

sentinel_time = object()

def f(snth):
    if snth is sentinel_time:
        print 'got em!'
f(sentinel_time)

사용하고 싶지 않은 경우if var == True:당신은 정말로 원합니다.if var:.

당신이 목록을 가지고 있다고 상상해 보세요.당신은 목록이 "이든 상관없습니다.True아니면, 그냥 비어있는지 알고 싶을 뿐입니다. 그래서...

l = ['snth']
if l:
    print l

이 게시물에서 무엇이 평가되는지 확인하십시오.FalsePython에서 부울식 평가

용사를 합니다.foo is Truefoo == True just (그냥)foo이 원하는 이 아닙니다 당신이 원하는 것이 아닌 경우가 대부분입니다.

본 적이 있습니다foo is True파라미터를 확인하는 데 사용됩니다.foo정말 부울적이었습니다.

  1. 이것은 파이썬의 오리 타입 철학과 모순됩니다(일반적으로 유형을 확인하지 않아야 합니다). 다르게 하는 함수True다른 진실 값들과 달리, 오리털을 가정하는 프로그래머에게는 반대되는 값입니다.)
  2. 유형을 확인하려는 경우에도 다음과 같이 다양하게 수행하는 것이 좋습니다.
def myFunction(foo):
    if not isinstance(foo, bool):
        raise ValueError("foo should be a boolean")
>>> myFunction(1)
Exception: ValueError "foo should be a boolean"

몇 가지 이유로:

  • 은 Bool ▁type▁only가 있는 유일한 입니다.is연산자는 다음과 같습니다.isinstance(a, bool) and a그것의 이유는 사실입니다.True그리고.False싱글톤입니다.다시 말해서, 이것은 파이썬의 잘 알려지지 않은 기능 때문에 작동합니다(특히 일부 튜토리얼이 당신에게 그것을 가르칠 때).True그리고.False는 에대별뿐입다니일칭의 입니다.1그리고.0).
  • 사용자가 isinstance를 사용하고 프로그래머가 함수가 truth-value를 받아들이지 않거나 함수가 다음을 사용자가 truth-value를 인식하지 못한 경우numpy그리고 그들의 numpy-down을 파이썬-down에 던지는 것을 잊었다, 그들은 그들이 무엇을 잘못했는지 알게이고 디버그를 할 수 있을 것입니다.

와 비교

def myFunction(foo):
    if foo is True:
       doSomething()
    else:
       doSomethingElse()

이경에는우,,myFunction(1)예외를 제기하지 않을 뿐만 아니라, 아마도 예상했던 것과 반대로 행동할 것입니다.이것은 예를 들어 누군가가 numpy boolean을 사용하는 경우 버그를 찾기 어렵게 만듭니다.

언제 사용해야 합니까?is True럼그?

편집: 하지 마십시오.다른 답변에 대한 댓글에 언급된 것처럼 PEP 8에 의해 명시적으로 경고됩니다.

편집: 이것은 나쁜 관행입니다. 3.9부터, 파이썬은 당신이 사용하려고 할 때 경고를 제기합니다.is리터럴에 비유하자면.@ Jay Dadhania의 아래 의견을 참조하십시오.으로 결적으로론.is리터럴과 비교하기 위해 사용해서는 안 되며 메모리 주소의 동일성을 확인하기 위해서만 사용해야 합니다.

그냥 사용하지 마세요.해야 할 유을확인하경우는야해를 사용합니다.isinstance.

이전 단락:

기본적으로, 그것은 단지 속기로서만 사용합니다.isinstance(foo, bool) and foo

제가 볼 수 있는 유일한 경우는 어떤 값이 참인지 명시적으로 확인하고 싶을 때이며, 나중에 그 값이 다른 참 값인지도 확인할 것입니다.예를 들어 다음과 같습니다.

if foo is True:
   doSomething()
elif foo is False:
   doSomethingElse()
elif foo is 1: #EDIT: raises a warning, use == 1 instead
   doYetSomethingElse()
else:
   doSomethingElseEntirely()

True에 대한 세 가지 테스트 형식의 차이를 확인할 수 있는 테스트는 다음과 같습니다.

for test in ([], [1], 0, 1, 2):
    print repr(test), 'T' if test else 'F', 'T' if test == True else 'F', 'T' if test is True else 'F'

[] F F F
[1] T F F
0 F F F
1 T T F
2 T F F

보시는 것처럼 모두 다른 결과를 전달하는 경우가 있습니다.

대부분의 경우, 당신은 이런 세부 사항에 신경 쓰지 말아야 합니다.도 이미 계실 겁니다.foo는 부울식입니다(따라서 사용할 수 있습니다).if foo) 또는 당신은 알고 있습니다.foo다른 것입니다(이 경우 테스트할 필요가 없습니다).변수의 유형을 모르는 경우 코드를 재팩터링할 수 있습니다.

하지만 당신이 정말로 확신할 필요가 있다면 그것은 정확합니다.True그리고 다른 것은 사용하지 않습니다.is.사용.==당신에게 줄 것입니다1 == True.

언급URL : https://stackoverflow.com/questions/27276610/boolean-identity-true-vs-is-true

반응형