'is'키워드는 파이썬에서 어떻게 구현됩니까?
... is
문자열에서 동등성을 위해 사용할 수있는 키워드.
>>> s = 'str'
>>> s is 'str'
True
>>> s is 'st'
False
나는 모두를 시도 __is__()
하고 __eq__()
있지만 작동하지 않았다.
>>> class MyString:
... def __init__(self):
... self.s = 'string'
... def __is__(self, s):
... return self.s == s
...
>>>
>>>
>>> m = MyString()
>>> m is 'ss'
False
>>> m is 'string' # <--- Expected to work
False
>>>
>>> class MyString:
... def __init__(self):
... self.s = 'string'
... def __eq__(self, s):
... return self.s == s
...
>>>
>>> m = MyString()
>>> m is 'ss'
False
>>> m is 'string' # <--- Expected to work, but again failed
False
>>>
문자열 테스트 is
는 문자열이 인턴 될 때만 작동합니다. 당신이 무엇을하는지 정말로 알고 있지 않는 한 , 당신은 절대로 문자열에 사용 해서는 안되는 문자열을 명시 적으로 인턴 합니다 .is
is
에 대한 테스트 의 정체성 이 아니라 평등 . 즉, 파이썬은 단순히 객체가 상주하는 메모리 주소를 비교합니다. is
기본적으로 "같은 객체에 대해 두 개의 이름이 있습니까?"라는 질문에 대답합니다 . -말도 안되는 과부하.
예를 들어, ("a" * 100) is ("a" * 100)
이다 거짓 . 일반적으로 Python은 각 문자열을 다른 메모리 위치에 씁니다. 인턴은 주로 문자열 리터럴에서 발생합니다.
is
연산자 비교 동등 id(x)
값. id
현재 포인터를 비교로 사용하도록 구현되었습니다. 따라서 is
자체적으로 과부하가 걸리지 않으며 AFAIK도 과부하가 걸리지 id
않습니다.
그래서 당신은 할 수 없습니다. 파이썬에서는 특이하지만 거기에 있습니다.
Python is
키워드는 개체 ID를 테스트합니다. 문자열이 같은지 테스트하는 데 사용해서는 안됩니다. 매우 높은 수준의 많은 언어와 마찬가지로 Python 구현이 문자열 "인터 닝"을 수행하기 때문에 자주 작동하는 것처럼 보일 수 있습니다. 즉, 문자열 리터럴과 값은 내부적으로 해시 된 목록에 보관되고 동일한 항목은 동일한 객체에 대한 참조로 렌더링됩니다. (파이썬 문자열은 불변이기 때문에 가능합니다).
그러나 구현 세부 사항과 마찬가지로 이것에 의존해서는 안됩니다. 동등성을 테스트하려면 == 연산자를 사용하십시오. 정말로 객체 신원을 테스트하고 싶다면 is
--- 를 사용하십시오. 그리고 문자열 객체 신원에 대해 신경 써야 할 경우를 생각해 내기가 어려울 것입니다. 불행히도 앞서 언급 한 인턴으로 인해 두 문자열이 "의도적으로"동일한 객체 참조인지 여부를 믿을 수 없습니다.
is
키워드 (두 개의 참조가 동일한 개체 인 경우 오히려, 비교 또는) 객체를 비교한다.
즉, 자체 구현을 제공 할 메커니즘이없는 이유라고 생각합니다.
파이썬은 문자열을 '영리하게'저장하기 때문에 때때로 문자열에서 작동하므로 두 개의 동일한 문자열을 만들 때 하나의 객체에 저장됩니다.
>>> a = "string"
>>> b = "string"
>>> a is b
True
>>> c = "str"+"ing"
>>> a is c
True
간단한 '복사'예제에서 참조 대 데이터 비교를 볼 수 있습니다.
>>> a = {"a":1}
>>> b = a
>>> c = a.copy()
>>> a is b
True
>>> a is c
False
당신이 바이트 코드로 어질러 두려워하지 않는 경우에, 당신은 차단하고 패치 할 수 있습니다 COMPARE_OP
와 8 ("is")
객체에 훅 기능이 비교되는 호출하는 인수입니다. 봐 dis
시작에 대한 모듈 문서.
그리고 __builtin__.id()
누군가가 id(a) == id(b)
대신 할 경우 가로채는 것도 잊지 마십시오 a is b
.
문자열이 '-'로 시작하면 문자열 변수를 문자열 값과 두 문자열 변수와 비교하지 못합니다. 내 Python 버전은 2.6.6입니다.
>>> s = '-hi'
>>> s is '-hi'
False
>>> s = '-hi'
>>> k = '-hi'
>>> s is k
False
>>> '-hi' is '-hi'
True
'is'는 객체 ID를 비교하는 반면 ==는 값을 비교합니다.
예:
a=[1,2]
b=[1,2]
#a==b returns True
#a is b returns False
p=q=[1,2]
#p==q returns True
#p is q returns True
is
연산자를 오버로드 할 수 없습니다 . 오버로드하려는 것은 ==
연산자입니다. 이는 __eq__
클래스에서 메소드를 정의하여 수행 할 수 있습니다 .
You are using identity comparison. == is probably what you want. The exception to this is when you want to be checking if one item and another are the EXACT same object and in the same memory position. In your examples, the item's aren't the same, since one is of a different type (my_string) than the other (string). Also, there's no such thing as someclass.__is__
in python (unless, of course, you put it there yourself). If there was, comparing objects with is wouldn't be reliable to simply compare the memory locations.
When I first encountered the is keyword, it confused me as well. I would have thought that is and == were no different. They produced the same output from the interpreter on many objects. This type of assumption is actually EXACTLY what is... is for. It's the python equivalent "Hey, don't mistake these two objects. they're different.", which is essentially what [whoever it was that straightened me out] said. Worded much differently, but one point == the other point.
the for some helpful examples and some text to help with the sometimes confusing differences visit a document from python.org's mail host written by "Danny Yoo"
or, if that's offline, use the unlisted pastebin I made of it's body.
in case they, in some 20 or so blue moons (blue moons are a real event), are both down, I'll quote the code examples
###
>>> my_name = "danny"
>>> your_name = "ian"
>>> my_name == your_name
0 #or False
###
###
>>> my_name[1:3] == your_name[1:3]
1 #or True
###
###
>>> my_name[1:3] is your_name[1:3]
0
###
Assertion Errors can easily arise with is keyword while comparing objects. For example, objects a and b might hold same value and share same memory address. Therefore, doing an
>>> a == b
is going to evaluate to
True
But if
>>> a is b
evaluates to
False
you should probably check
>>> type(a)
and
>>> type(b)
These might be different and a reason for failure.
참고URL : https://stackoverflow.com/questions/2987958/how-is-the-is-keyword-implemented-in-python
'development' 카테고리의 다른 글
영숫자 문자 만 허용하도록 EditText를 제한하는 방법 (0) | 2020.12.06 |
---|---|
내 Mac에서 xcode 버전을 기본값으로 설정하는 방법은 무엇입니까? (0) | 2020.12.06 |
값 C #을 가장 가까운 정수로 반올림하는 방법은 무엇입니까? (0) | 2020.12.06 |
C에서 main에 대한 인수 (0) | 2020.12.06 |
C ++에서 열거 형 데이터의 크기는 얼마입니까? (0) | 2020.12.06 |