2013-05-17 65 views
6

Hành vi sai trái của biểu thức "là" trong python.python đánh giá các biểu thức "là" như thế nào?

>>> 258 -1 is 257 
False 

>>> 258 -1 == 257 
True 
  1. như thế nào python đánh giá "là" biểu hiện? và tại sao nó cho thấy nó là sai, dù nó là sự thật?

  2. Tại sao nó chỉ xảy ra với một số số nhất định?

    2 - 1 là 1 Đúng

công trình hoàn toàn tốt đẹp.

+0

'>>> 2-1 là 1' trả về' True' lol – TehTris

+0

@carlosdc không chính xác là trùng lặp. Vì nó hoạt động cho các số khác. Đó là lý do tại sao tôi hỏi. – Rahul

+1

@Rahul Làm rõ điều đó trong câu hỏi của bạn. – askewchan

Trả lời

2

is so sánh danh tính đối tượng và sản lượng True chỉ khi cả hai bên là cùng một đối tượng. Vì lý do hiệu suất, Python duy trì một "bộ nhớ cache" của các số nguyên nhỏ và tái sử dụng chúng, vì vậy tất cả các đối tượng int(1) đều là cùng một đối tượng. Trong CPython, các số nguyên được lưu trong bộ nhớ cache nằm trong khoảng từ -5 đến 255, nhưng đây là một chi tiết triển khai, do đó bạn không nên dựa vào nó. Nếu bạn muốn so sánh bình đẳng, hãy sử dụng ==, không phải is.

+0

Bạn cũng có thể nhận được rằng loại điều xảy ra với chuỗi như chuỗi literals được lưu trữ lên đến một kích thước nhất định. Và những thứ như 'foo =" foo "; foo là foo.strip() 'cũng có thể trả về' True'. – mgilson

1

Kiểm tra Python is operator cho nhận dạng đối tượng, không phải giá trị đối tượng. Hai số nguyên phải tham chiếu đến cùng một đối tượng thực tế bên trong là trả về true.

Điều này sẽ trả về true cho các số nguyên "nhỏ" do bộ đệm trong được duy trì bởi Python, nhưng hai số có cùng giá trị sẽ không trả về true nếu so sánh với is nói chung.

6

is được sử dụng để kiểm tra danh tính, để kiểm tra xem cả hai biến trỏ đến cùng một đối tượng, trong khi == được sử dụng để kiểm tra giá trị.

Từ docs:

Các nhà khai thác isis not thử nghiệm cho nhận dạng đối tượng: x is ytrue khi và chỉ khi x và y là cùng một đối tượng. x is not y mang lại giá trị chân lý nghịch đảo .

>>> id(1000-1) == id(999) 
False 

""" What is id? 
id(object) -> integer 
Return the identity of an object. This is guaranteed to be unique among 
simultaneously existing objects. (Hint: it's the object's memory address.) 
""" 

>>> 1000-1 is 999 
False 
>>> 1000-1 == 999 
True 
>>> x = [1] 
>>> y = x #now y and x both point to the same object 
>>> y is x 
True 
>>> id(y) == id(x) 
True 
>>> x = [1] 
>>> y = [1] 
>>> x == y 
True 
>>> x is y 
False 
>>> id(x),id(y)  #different IDs 
(161420364, 161420012) 

Nhưng một số nguyên nhỏ (-5 đến 256) và dây nhỏ được lưu trữ bởi Python: Why (0-6) is -6 = False?

#small strings 
>>> x = "foo" 
>>> y = "foo" 
>>> x is y 
True 
>>> x == y 
True 
#huge string 
>>> x = "foo"*1000 
>>> y = "foo"*1000 
>>> x is y 
False 
>>> x==y 
True 
2

Các is kiểm tra nhà điều hành cho nhận dạng đối tượng: đối tượng được tạo ra bằng cách gọi 258-1 là KHÔNG phải là đối tượng giống với đối tượng được tạo bởi 257. Toán tử == kiểm tra xem các giá trị của các đối tượng được so sánh có giống nhau hay không.

Thử sử dụng help('is').

+0

Vậy tại sao 2-1 là 1 trả về Đúng? – Rahul

+0

@Rahul python lưu trữ một số số nguyên nhỏ và chuỗi nhỏ, xem: http://stackoverflow.com/questions/11476190/why-0-6-is-6-false –

+0

Đã trả lời ở đây: http://stackoverflow.com/a/16615952/2237320 – Alice

Các vấn đề liên quan