두 변수가 파이썬에서 동일한 객체를 참조하는지 비교


답변:


133

그 이유 is는 다음 과 같습니다. 동일한 객체 인 경우 x is y반환 합니다.Truexy


6
이 예 x is z에서는를 반환합니다 False. 그러나 x와 z에 목록 대신 동일한 값이 할당되면 (예 x, z = 13, 13:)를 x is z반환합니다 True. 왜 그런 겁니까?
Bill

12
@Bill : 이것은 파이썬이 int를 처리하는 방법의 인공물입니다. 어떤 사물의 정수 파이썬 할당 xz지점. 작은 정수는 오류가 자주 발생하기 때문에 (오류 값은 -1, 실제로 색인을 생성 할 때마다 0, 작은 숫자는 일반적으로 합리적인 기본값) Python은 작은 숫자 (-5 ~ 256)를 사전 할당하여 최적화하고 동일한 정수 객체를 재사용합니다. 따라서 귀하의 예는이 범위의 숫자에만 적용됩니다. 더 큰 것을 할당 해보십시오 270. 더 많은 정보는 여기를보세요
ted

1
@AndresR 아니, 틀렸어. is두 이름이 동일한 메모리 위치를 참조하는지 확인합니다. 객체 자체와는 관련이 없습니다. 동일하지만 동일한 위치에 저장되지 않은 문자열과 같은 불변 객체를 갖는 것은 쉽습니다 (예 ''a'*10000 is 'a' * 10000: False).
Jochen Ritzel 2017

1
@JochenRitzel 당신이 완전히 옳습니다.이 의견에 감사드립니다! 그래서 무슨 일이 일어나고 있는지 알 수 "af" is "af"없거나 () is ()... 왜 그들은 같은 메모리 위치를 공유합니까?
AndresR

2
@AndreasR 코드의 리터럴 문자열 / 숫자에 대해 컴파일러는 한 번만 존재하는지 확인하고 다시 사용합니다. (), None, True, False 등과 같은 특수 값도 싱글 톤으로 정의됩니다. 실행 중에 런타임은 또한 작은 숫자와 문자열을 재사용하려고 시도하지만 결국 속도와 메모리 사이의 상충 관계이며 발생하는 일은 Python 런타임이 구현 된 방법에 따라 다릅니다.
요헨 Ritzel


11

두 올바른 솔루션 동안 x is z과이 id(x) == id(z)이미 게시 된, 파이썬의 구현 세부 사항을 지적하고 싶다. 파이썬은 정수를 객체로 저장합니다. 최적화로 시작 부분 (-5 ~ 256)에 작은 정수 묶음을 생성하고 이러한 사전 초기화 된 객체에 작은 값을 가진 정수를 포함하는 모든 변수를 가리 킵니다. 더 많은 정보

즉, 동일한 작은 숫자 (-5 ~ 256)로 초기화 된 정수 객체의 경우 두 객체가 동일한 지 확인하면 true를 반환합니다 ( ON C-Pyhon , 이것이 구현 세부 사항 임을 알고있는 한 ). 하나의 객체가 다른 객체에서 초기화 된 경우에만 true를 반환합니다.

> i = 13
> j = 13
> i is j
True

> a = 280
> b = 280
> a is b
False

> a = b
> a
280
> a is b
True

파이썬 3.6 : a = 98765; b = 98765; a는 b => 참입니다. 뭔가 분명히 바뀌 었습니다.
Mikhail Kalashnikov

@MikhailKalashnikov 아니. Python 3.6.2에서 테스트했지만 여전히 존재합니다.
괜찬아

여전히 파이썬 3.7.7에 존재
Bill Huang

9

또한 id () 를 사용 하여 각 변수 이름이 참조하는 고유 한 개체를 확인할 수 있습니다 .

In [1]: x1, x2 = 'foo', 'foo'

In [2]: x1 == x2
Out[2]: True

In [3]: id(x1), id(x2)
Out[3]: (4509849040, 4509849040)

In [4]: x2 = 'foobar'[0:3]

In [5]: x2
Out[5]: 'foo'

In [6]: x1 == x2
Out[6]: True

In [7]: x1 is x2
Out[7]: False

In [8]: id(x1), id(x2)
Out[8]: (4509849040, 4526514944)

id 사용에 대한 @ted의 메모는 여기에서 상당히 관련이 있습니다.
Leo Ufimtsev


2

이것은 docs.python.org에서 가져온 것입니다. "모든 객체에는 ID, 유형 및 값이 있습니다. 객체의 ID는 일단 생성 된 후에는 변경되지 않습니다. 메모리에있는 객체의 주소라고 생각할 수 있습니다. 'is'연산자 두 개체의 ID를 비교합니다. id () 함수는 ID를 나타내는 정수를 반환합니다. "

분명히 값을 변경할 때마다 개체는 ID 변경으로 표시된대로 다시 생성됩니다. x = 3 행 다음에 x = 3.14 행은 오류를 제공하지 않고 x에 대해 다른 ID, 유형 및 값을 제공합니다.


1
훌륭한 문서 캐치.
prosti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.