부울 ID == 참 대 참
▁use를 사용하는 것은 표준 입니다.if foo is None
if foo == None
값이 구체적으로 무엇인지 테스트합니다.None
.
값이 정확한지 여부를 확인하려면True
(단순히 실제와 같은 값이 아님), 사용해야 할 이유가 있습니까?if foo == True
if foo is True
CPython(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
값이 참과 같습니다.
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
이 게시물에서 무엇이 평가되는지 확인하십시오.False
Python에서 부울식 평가
용사를 합니다.foo is True
에 foo == True
just (그냥)foo
이 원하는 이 아닙니다 당신이 원하는 것이 아닌 경우가 대부분입니다.
본 적이 있습니다foo is True
파라미터를 확인하는 데 사용됩니다.foo
정말 부울적이었습니다.
- 이것은 파이썬의 오리 타입 철학과 모순됩니다(일반적으로 유형을 확인하지 않아야 합니다). 다르게 하는 함수
True
다른 진실 값들과 달리, 오리털을 가정하는 프로그래머에게는 반대되는 값입니다.) - 유형을 확인하려는 경우에도 다음과 같이 다양하게 수행하는 것이 좋습니다.
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
'programing' 카테고리의 다른 글
오라클에 내장된 해시 기능이 있습니까? (0) | 2023.07.21 |
---|---|
파이썬과 Numpy를 사용하여 r-제곱을 계산하려면 어떻게 해야 합니까? (0) | 2023.07.21 |
REST API용 spring-boot-starter-web과 spring-boot-starter-data-rest의 차이점 (0) | 2023.07.21 |
OracleDB에서 "예상 NUMBER but got BINARY"를 가져오지 않고 Long 값의 null을 쿼리하려면 어떻게 해야 합니까? (0) | 2023.07.21 |
팬더에 쉼표가 있는 숫자 문자열을 부동으로 변환합니다. DataFrame (0) | 2023.07.21 |