programing

"is" 연산자는 정수로 예기치 않게 동작합니다.

projobs 2022. 9. 29. 22:09
반응형

"is" 연산자는 정수로 예기치 않게 동작합니다.

Python에서 다음 동작이 예기치 않게 되는 이유는 무엇입니까?

>>> a = 256
>>> b = 256
>>> a is b
True           # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False          # What happened here? Why is this False?
>>> 257 is 257
True           # Yet the literal numbers compare properly

Python 2.5.2를 사용하고 있습니다.Python의 다른 버전을 사용해 보면 Python 2.3.3은 99에서 100 사이의 위의 동작을 보여줍니다.

으로는 큰 으로 "할 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수, 수 등입니다.is이치노왜이이 는상? 상??? 상??숫자인지 아닌지 미리 알 수 없을 때 두 개의 임의의 물체를 비교하여 동일한지 여부를 확인하는 더 좋은 방법은 무엇일까요?

이것 좀 보세요.

>>> a = 256
>>> b = 256
>>> id(a)
9987148
>>> id(b)
9987148
>>> a = 257
>>> b = 257
>>> id(a)
11662816
>>> id(b)
11662828

다음은 Python 2 설명서 "일반 정수 개체"에서 찾은 내용입니다(Python 3도 마찬가지임).

현재 구현에서는 -5 ~256 범위의 모든 정수에 대해 정수 객체 배열을 유지합니다.이 범위에서 int를 작성하면 기존 객체에 대한 참조만 반환됩니다.따라서 1의 값을 변경할 수 있습니다.이 경우 Python의 동작은 정의되지 않은 것으로 생각됩니다. :-)

Python의 "is" 연산자가 정수로 예기치 않게 동작합니다.

요약 - 강조하겠습니다.정수를 비교하는 데 사용하지 마십시오.

이건 네가 기대할 만한 행동이 아니야.

''를 합니다.== ★★★★★★★★★★★★★★★★★」!=각각 평등과 불평등을 비교합니다.예를 들어 다음과 같습니다.

>>> a = 1000
>>> a == 1000       # Test integers like this,
True
>>> a != 5000       # or this!
True
>>> a is 1000       # Don't do this! - Don't use `is` to test integers!!
False

설명.

이를 알기 위해서는 다음 사항을 알아야 합니다.

먼저, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이 예요?is그래? 이건 비교 연산자야매뉴얼에서 다음 항목을 참조하십시오.

" "is ★★★★★★★★★★★★★★★★★」is notID : " " " ID " " :x is y사실대로 말하다 x is not y아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.

따라서 다음과 같습니다.

>>> a is b
>>> id(a) == id(b)

매뉴얼에서 다음 항목을 참조하십시오.

id 개체의 "아이덴티티"를 반환합니다.이것은 이 오브젝트의 라이프 타임 동안 한결같고 일정함을 보증하는 정수(또는 긴 정수)수명이 겹치지 않는 두 개체의 수명이 같을 수 있습니다.id()discloss.discloss 。

CPython(Python의 참조 구현)에 있는 객체의 ID가 메모리 내 위치라는 사실은 구현 세부 사항입니다.Python의등에서는 Python에 대해 쉽게 수 .id.

그럼, 의 사용 사례는 무엇일까요?is? PEP8의 설명:

음음음음음 compar compar like like like like 와 같은 None 해야 한다is ★★★★★★★★★★★★★★★★★」is not 연산자를 하지 않습니다 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .

질문

다음 질문(코드 포함)을 묻고 기술합니다.

Python에서 다음 동작이 예기치 않게 되는 이유는 무엇입니까?

>>> a = 256
>>> b = 256
>>> a is b
True           # This is an expected result

그것은 기대했던 결과가 아니다.왜 예상되죠?그 말은 정수의 가치가256쌍방에 a ★★★★★★★★★★★★★★★★★」b는 같은 정수의 인스턴스입니다.Python에서는 정수는 불변하기 때문에 변경할 수 없습니다.이것은 어떤 코드에도 영향을 주지 않습니다.예상할 수 없는 일입니다.을 사용법

그러나 값이 256이라고 말할 때마다 메모리 내에 새로운 인스턴스가 존재하지 않는 것을 다행으로 여겨야 합니다.

>>> a = 257
>>> b = 257
>>> a is b
False          # What happened here? Why is this False?

이 '이다'인 두 인스턴스가 것 .257 하기 때문에 낭비하게 .정수는 불변의 것이기 때문에, 이것은 메모리를 낭비합니다.우리가 그것을 많이 낭비하지 않기를 바라자.아마 아닐 거예요.그러나 이 동작은 보증되지 않습니다.

>>> 257 is 257
True           # Yet the literal numbers compare properly

Python의 특정 구현은 스마트하게 하기 위해 노력하고 있으며, 필요한 경우가 아니면 메모리 내에 중복적으로 가치 있는 정수를 생성하지 않는 것처럼 보입니다.CPython인 Python의 참조 구현을 사용하고 있는 것 같습니다.CPython에 좋습니다.

CPython이 이것을 글로벌하게 실시할 수 있다면, (검색에 비용이 드는 것처럼) 더 저렴하게 실시할 수 있다면, 아마도 또 다른 구현이 가능할 것이다.

단, 코드에 미치는 영향에 대해서는 정수가 정수의 특정 인스턴스인지 아닌지는 신경 쓰지 마십시오., 이 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "==.

what?is

is는, 「」가 「」, 「」, 「」, 「」, 「」, 「」를 확인합니다.id츠키다CPython이라고 .id는 메모리 내의 위치입니다만, 다른 실장에서는 일의로 식별되는 다른 번호일 가능성이 있습니다.다음과 같이 합니다.

>>> a is b

와 같다

>>> id(a) == id(b)

는 ""를 ?is ????

이것은 매우 긴 두 문자열의 값이 동일한지 확인하는 것에 비해 매우 빠른 체크가 될 수 있습니다.그러나 이는 객체의 고유성에 적용되기 때문에 이에 대한 사용 사례는 한정되어 있습니다. 그것을 , 리 in 、 in 、 리 、 리 、 보 、 보 、 in 、 in 、 in 、 in 、 in 、 。None이것은 싱글톤(메모리 내의 한 장소에 존재하는 유일한 인스턴스)입니다. 수 있는 이 있는 에는 다른 싱글톤을 , 이 '싱글톤'으로 확인할 수 .이러한 싱글톤을 사용하여 확인할 수 있습니다.is드물어요.파이썬 2의 3개의 3개의 3개의 3번째 파이썬 3번째 파이썬.

SENTINEL_SINGLETON = object() # this will only be created one time.

def foo(keyword_argument=None):
    if keyword_argument is None:
        print('no argument given to foo')
    bar()
    bar(keyword_argument)
    bar('baz')

def bar(keyword_argument=SENTINEL_SINGLETON):
    # SENTINEL_SINGLETON tells us if we were not passed anything
    # as None is a legitimate potential argument we could get.
    if keyword_argument is SENTINEL_SINGLETON:
        print('no argument given to bar')
    else:
        print('argument to bar: {0}'.format(keyword_argument))

foo()

인쇄 대상:

no argument given to foo
no argument given to bar
argument to bar: None
argument to bar: baz

.is라고 하면 인지 구분할 수 .bar되며, 이 이 인수로 되면 인수로 호출됩니다.None이러한 것들이 주요 사용 사례입니다.is- 정수, 문자열, 튜플 또는 이와 같은 것의 동일성을 검정하는 데 사용하지 마십시오.

늦었지만, 답을 알려줄까?더 많은 사람들이 따라할 수 있도록 제가 이 단어를 소개하도록 노력하겠습니다.


CPython의 좋은 점은 이 문제의 출처를 실제로 볼 수 있다는 것입니다.3.5 릴리즈용 링크를 사용하지만 대응하는 2.x를 찾는 것은 간단합니다.

CPython에서 신규 작성을 처리하는 C-API 함수int오브젝트는 입니다.이 함수에 대한 설명은 다음과 같습니다.

현재 구현에서는 -5 ~256 범위의 모든 정수에 대해 정수 객체 배열을 유지합니다.이 범위에서 int를 작성하면 기존 객체에 대한 참조만 반환됩니다.따라서 1의 값을 변경할 수 있습니다.이 경우 Python의 동작은 정의되지 않은 것으로 생각됩니다. :-)

(이탤릭체)

넌 어떨지 모르겠지만 난 이걸 보고 이렇게 생각해.저 어레이를 찾아보자!

CPython을 구현하고 있는 C 코드를 만지작거리지 않았다면 해야 합니다.모든 것이 매우 체계적이고 읽기 쉽기 때문입니다.이 경우 메인 소스 코드 디렉토리 트리의 서브 디렉토리를 조사해야 합니다.

PyLong_FromLonglong사물을 추리하는 것은 어렵지 않습니다.내부를 들여다보면 혼란스럽다고 생각할 수 있습니다.그것은 혼란스럽지만 두려워할 필요는 없습니다.우리가 찾고 있는 기능은 230호선에서 우리가 그것을 확인하기를 기다리고 있습니다.작은 기능이기 때문에 본체(선언 제외)는 여기에 쉽게 붙여넣을 수 있습니다.

PyObject *
PyLong_FromLong(long ival)
{
    // omitting declarations

    CHECK_SMALL_INT(ival);

    if (ival < 0) {
        /* negate: cant write this as abs_ival = -ival since that
           invokes undefined behaviour when ival is LONG_MIN */
        abs_ival = 0U-(unsigned long)ival;
        sign = -1;
    }
    else {
        abs_ival = (unsigned long)ival;
    }

    /* Fast path for single-digit ints */
    if (!(abs_ival >> PyLong_SHIFT)) {
        v = _PyLong_New(1);
        if (v) {
            Py_SIZE(v) = sign;
            v->ob_digit[0] = Py_SAFE_DOWNCAST(
                abs_ival, unsigned long, digit);
        }
        return (PyObject*)v; 
}

우리는 C 마스터 코드 haxxorz는 아니지만 바보도 아닙니다.CHECK_SMALL_INT(ival);우리 모두를 유혹적으로 훔쳐보는데 그게 이 일과 관련이 있다는 걸 알 수 있어요확인해 보겠습니다.

#define CHECK_SMALL_INT(ival) \
    do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
        return get_small_int((sdigit)ival); \
    } while(0)

'함수', '함수', '함수'를 불러오는 매크로입니다.get_small_intival

if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS)

ㅇㅇㅇㅇ가 예요?NSMALLNEGINTS ★★★★★★★★★★★★★★★★★」NSMALLPOSINTS? 매크로!이하에 나타냅니다.

#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS           257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS           5
#endif

우리의 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」if (-5 <= ival && ival < 257)get_small_int.

다음으로, 그 모든 것을 살펴봅시다(흥미로운 것은 거기에 있기 때문에, 몸통만 살펴봅시다).

PyObject *v;
assert(-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS);
v = (PyObject *)&small_ints[ival + NSMALLNEGINTS];
Py_INCREF(v);

그럼 .PyObject이전 조건이 할당을 유지하고 있음을 단언합니다.

v = (PyObject *)&small_ints[ival + NSMALLNEGINTS];

small_ints우리가 찾던 어레이와 매우 흡사해 보이는데, 바로 그거야!그냥 망할 문서만 읽으면 처음부터 알있었을 텐데!

/* Small integers are preallocated in this array so that they
   can be shared.
   The integers that are preallocated are those in the range
   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/
static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS];

새로 만들고 int [NSMALLNEGINTS, NSMALLPOSINTS)미리 할당된 기존 개체에 대한 참조만 다시 얻을 수 있습니다.

오브젝트를 에, 「」를 발행합니다.id() "Direct" 또는 "" (ID 확인)is똑같은 걸 돌려줄 거예요

그런데 언제 할당되나요?

Python 초기화 중에 For 루프에 들어가 이 작업을 수행합니다.

for (ival = -NSMALLNEGINTS; ival <  NSMALLPOSINTS; ival++, v++) {

루프 본체를 읽으려면 소스를 확인하십시오!

내 설명으로 C가 확실히 되었기를 바랍니다(벌칙은 분명히 의도되어 있습니다).


렇지 but but , but 。257 is 257★★★★★★★★★★★★★★★★?

이것은 실제로 설명하기가 더 쉬우며, 는 이미 그렇게 하려고 했습니다.이것은 Python이 이 인터랙티브한 스테이트먼트를 하나의 블록으로 실행할 것이기 때문입니다.

>>> 257 is 257

하는 은 2개의 이 있음을 리터럴을 합니다.PyLongObject257컴파일을 직접 수행하여 내용을 조사하면 다음과 같이 표시됩니다.

>>> codeObj = compile("257 is 257", "blah!", "exec")
>>> codeObj.co_consts
(257, None)

CPython이 작업을 수행하면 동일한 개체가 로드됩니다.

>>> import dis
>>> dis.dis(codeObj)
  1           0 LOAD_CONST               0 (257)   # dis
              3 LOAD_CONST               0 (257)   # dis again
              6 COMPARE_OP               8 (is)

★★★★★★★★★★★★★★★★★.isTrue.

두 항목이 동일한지 또는 동일한 개체인지 확인하는 방법에 따라 달라집니다.

is는, 그것들이 같은 오브젝트인지 아닌지를 확인합니다.는 공간 을 위해 수 .

In [29]: a = 3
In [30]: b = 3
In [31]: id(a)
Out[31]: 500729144
In [32]: id(b)
Out[32]: 500729144

하면 됩니다.==임의의 객체의 동일성을 비교합니다.할 수 .__eq__ , , , , 입니다.__ne__★★★★★★ 。

소스 파일을 bject.c 체크인 할 수 있는 것처럼 Python은 효율성을 위해 작은 정수를 캐시합니다.작은 정수에 대한 참조를 작성할 때마다 새 개체가 아닌 캐시된 작은 정수를 참조합니다.257은 작은 정수가 아니기 때문에 다른 개체로 계산됩니다.

==그 목적을 위해.

저는 당신의 가설이 옳다고 생각합니다.의험의 id (오브젝트 삭제):

In [1]: id(255)
Out[1]: 146349024

In [2]: id(255)
Out[2]: 146349024

In [3]: id(257)
Out[3]: 146802752

In [4]: id(257)
Out[4]: 148993740

In [5]: a=255

In [6]: b=255

In [7]: c=257

In [8]: d=257

In [9]: id(a), id(b), id(c), id(d)
Out[9]: (146349024, 146349024, 146783024, 146804020)

★★★★★★★★★★★★★★★★★★★★★★★★」<= 255리터럴로 취급되며 위의 모든 것은 다르게 취급됩니다.

기존 답변에서 지적되지 않은 다른 문제가 있습니다.Python은 임의의 2개의 불변의 값을 Marge할 수 있으며, 사전에 작성된 작은 int 값만이 이러한 현상이 발생하는 것은 아닙니다.Python의 실장에서는, 이것을 보증할 수 없습니다만, 모두 작은 ints만을 위해서가 아닙니다.


그 빈 값, 빈 값, 빈 값, 빈 값, 빈 값 등이 .tuple,str , , , , 입니다.bytes짧은 문자열(CPython 3.6에서는 256개의 단일 문자 라틴-1 문자열)이 있습니다.예를 들어 다음과 같습니다.

>>> a = ()
>>> b = ()
>>> a is b
True

또한 미리 생성되지 않은 값도 같을 수 있습니다.다음 예를 생각해 보겠습니다.

>>> c = 257
>>> d = 257
>>> c is d
False
>>> e, f = 258, 258
>>> e is f
True

이것은 리리것 to to에 .int§:

>>> g, h = 42.23e100, 42.23e100
>>> g is h
True

사전에 된 CPython이 되어 있지 않습니다.float42.23e100 래서서무?무 슨??

는 CPython과 같이 의 몇 가지 값을 .int,float,str,bytes, 같은 컴파일 유닛에 있습니다.모듈의 경우 모듈 전체가 컴파일 유닛이지만 인터랙티브인터프리터에서는 각 스테이트먼트가 개별 컴파일 유닛입니다.★★c ★★★★★★★★★★★★★★★★★」d개별 문장으로 정의되며 값이 병합되지 않습니다.★★e ★★★★★★★★★★★★★★★★★」f마지하다


바이트 코드를 분해하면 무슨 일이 일어나고 있는지 알 수 있습니다. 하다, 하다, , 하다, 하다,e, f = 128, 128에 전화해요.dis.dis위에 것을 알 수 (128, 128)

>>> def f(): i, j = 258, 258
>>> dis.dis(f)
  1           0 LOAD_CONST               2 ((128, 128))
              2 UNPACK_SEQUENCE          2
              4 STORE_FAST               0 (i)
              6 STORE_FAST               1 (j)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE
>>> f.__code__.co_consts
(None, 128, (128, 128))
>>> id(f.__code__.co_consts[1], f.__code__.co_consts[2][0], f.__code__.co_consts[2][1])
4305296480, 4305296480, 4305296480

에 「이러다」가 되어 있는 알 수 .128바이트 코드에 의해 실제로 사용되지 않더라도 상수로 지정되므로 CPython의 컴파일러가 얼마나 적은 최적화를 수행하는지 알 수 있습니다. ( 있지 않은) 즉, (비어 있지 않은) 튜플은 병합되지 않습니다.

>>> k, l = (1, 2), (1, 2)
>>> k is l
False

.dis그러면자세히봐주세요.자세히 보세요.co_consts 있어요.1 a. a. a.2, 2개, 1개(1, 2) 것을 1 ★★★★★★★★★★★★★★★★★」2 않다, 않아요.((1, 2), (1, 2))두 개의 서로 다른 동일한 튜플을 가진 튜플.


CPython이 하는 또 하나의 최적화는 문자열 인터닝입니다.컴파일러의 계속적인 폴딩과는 달리 이는 소스 코드 리터럴에만 국한되지 않습니다.

>>> m = 'abc'
>>> n = 'abc'
>>> m is n
True

은 한, 것, 음, 음으로 된다.str내부 스토리지 종류 문자열 "ascii compact", "syslog" 또는 "syslog ready"로 입력합니다.많은 경우 "ascii compact"만 interning 됩니다.


어쨌든, 어떤 값이어야 하는지, 구별할 수 없는지에 대한 규칙은 구현마다, 그리고 동일한 구현의 버전마다, 그리고 동일한 구현의 동일한 복사본에서 동일한 코드를 실행하는 경우에도 달라집니다.

하나의 특정 Python에 대한 규칙을 익히는 것은 재미를 위해 가치가 있을 수 있습니다.하지만 코드에 의존할 필요는 없습니다.안전한 규칙은 다음과 같습니다.

  • 로 작성된 의 값이(「불변의 값」은 하지 말아 주세요x is y하다, 사용하다x == y)
  • 로 작성된 의 값이 것으로 x is not y하다, 사용하다x != y)

'보다 낫다'는 것만 요.is된 싱글톤을 예: 'SingletonsNone한되는 것(, 코드 내의 한 에만 작성됩니다_sentinel = object()★★★★★★★★★★★★★★★★★★」

int, 문자열 또는 데이터 타임과 같은 불변의 값 객체의 경우 객체 ID는 특별히 유용하지 않습니다.평등에 대해 생각하는 것이 더 낫다.ID는 기본적으로 가치 개체의 구현 세부 사항입니다. 이러한 개체는 불변하기 때문에 동일한 개체 또는 여러 개체에 대한 여러 참조를 갖는 것과 효과적인 차이는 없습니다.

is 아이덴티티 균등화 연산자(동작하는 기능)입니다.id(a) == id(b)); 다만, 같은 2개의 숫자가 반드시 같은 오브젝트는 아닙니다.퍼포먼스상의 이유로 일부 작은 정수는 메모화되어 있기 때문에 같은 경향이 있습니다(불변하기 때문에 이것은 가능합니다).

PHP† ===연산자는 및됩니다.x == y and type(x) == type(y)하지만, 일반 번호와는 다릅니다.is를 정의하는 __eq__다음 중 하나:

class Unequal:
    def __eq__(self, other):
        return False

PHP는 분명히 "빌트인" 클래스에 대해서도 같은 것을 허용합니다(이것은 PHP가 아닌 C 레벨에서 구현되는 것을 의미합니다).조금 덜 불합리한 사용은 숫자로 사용될 때마다 다른 값을 갖는 타이머 개체일 수 있습니다.의 Visual Basic을 Now「라고 하는 이 아니라, 「」라고 하는 것을 나타냅니다.time.time()★★★★★★ 。

Greg Hewgill(OP)은 다음과 같은 명확한 코멘트를 했습니다.내 목표는 가치의 평등이 아니라 객체 정체성을 비교하는 것입니다.개체 ID를 가치의 평등과 동일하게 취급하고 싶은 숫자는 제외합니다."

비교 수 .== ★★★★★★★★★★★★★★★★★」is. CPython은 PyNumber를 포함한 번호 프로토콜을 정의합니다._체크합니다만, Python 자체에서는 액세스 할 수 없습니다.

''를 하겠습니다.isinstance우리가 알고 있는 모든 숫자 유형을 포함하지만, 이것은 불완전할 수밖에 없습니다.유형 모듈에 StringTypes 목록이 있지만 번호가 없습니다.유형. Python 2.6 이후 기본 제공 번호 클래스에 기본 클래스가 있지만 다음과 같은 문제가 있습니다.

import numpy, numbers
assert not issubclass(numpy.int16,numbers.Number)
assert issubclass(int,numbers.Number)

덧붙여서, NumPy는 낮은 숫자의 인스턴스를 별도로 생성합니다.

나는 사실 이 질문의 변형에 대한 답을 모른다.하여 ctypes를 호출할 수 .PyNumber_Check하지만 그 기능조차 논의되고 있고, 확실히 휴대할 수 있는 것은 아닙니다.지금 테스트하는 것에 대해 좀 덜 까다롭게 굴면 됩니다.

결국, 이 문제는 원래 Python이 Scheme's와 같은 술어를 가진 타입 트리를 가지고 있지 않았기 때문에 발생합니다. number? 또는 Haskell's stype classNum. is는 오브젝트 ID를 체크하고 값의 동일성은 체크하지 않습니다. 역사를 , PHP는 PHP의 역사를 가지고 있습니다.===이 사납디다isPHP4가 아닌 PHP5의 객체에서만 사용할 수 있습니다.언어(버전 포함)를 넘나들면서 점점 더 많은 어려움을 겪고 있습니다.

다음 문자열에서도 발생합니다.

>>> s = b = 'somestr'
>>> s == b, s is b, id(s), id(b)
(True, True, 4555519392, 4555519392)

이제 모든 것이 괜찮아 보인다.

>>> s = 'somestr'
>>> b = 'somestr'
>>> s == b, s is b, id(s), id(b)
(True, True, 4555519392, 4555519392)

그것도 역시 예상된 일이다.

>>> s1 = b1 = 'somestrdaasd ad ad asd as dasddsg,dlfg ,;dflg, dfg a'
>>> s1 == b1, s1 is b1, id(s1), id(b1)
(True, True, 4555308080, 4555308080)

>>> s1 = 'somestrdaasd ad ad asd as dasddsg,dlfg ,;dflg, dfg a'
>>> b1 = 'somestrdaasd ad ad asd as dasddsg,dlfg ,;dflg, dfg a'
>>> s1 == b1, s1 is b1, id(s1), id(b1)
(True, False, 4555308176, 4555308272)

예상 밖이네요.

Python 3.8의 새로운 기능: Python 동작의 변화:

이제 컴파일러는 ID 확인 시 SyntaxWarning을 생성합니다(is ★★★★★★★★★★★★★★★★★」is not,,ssss ) ( string , ints ) 。이것들은 CPython에서 우연히 동작하는 경우가 많지만 언어 사양에서는 보증되지 않습니다. 테스트(「동등성 테스트를 하고 있습니다.== ★★★★★★★★★★★★★★★★★」!=을 클릭합니다을 클릭합니다.

언급URL : https://stackoverflow.com/questions/306313/is-operator-behaves-unexpectedly-with-integers

반응형