2014-06-08 15 views
6

Trong khi cố gắng để trả lời một câu hỏi về việc sử dụng các từ khóa is, tôi đã tìm ra rằng mã này:Tại sao "a là b" hoạt động khác trên Chế độ tương tác và khi nó chạy từ tập lệnh?

Script:

a = 123456 
b = 123456 
print a is b # True 

Interactive mode:

>>> a = 123456 
>>> b = 123456 
>>> a is b 
False 

đã đưa ra các kết quả đầu ra khác nhau trên chế độ Tương tác Python và khi nó được chạy từ một tập lệnh.

Từ this answer:

Việc thực hiện giữ một mảng của các đối tượng số nguyên cho tất cả các số nguyên giữa -5 và 256, khi bạn tạo một int trong phạm vi mà bạn thực sự chỉ có được trở lại một tham chiếu đến đối tượng hiện có .

Vì vậy, tôi hy vọng rằng a is b chỉ trả lại True chỉ cho các số nguyên trong phạm vi [-5, 256]. Nhưng nó chỉ đúng trên chế độ Tương tác, không phải khi nó được chạy từ một tập lệnh.

Câu hỏi: Tại saoa is b cư xử khác nhau trên chế độ tương tác và khi nó chạy từ kịch bản?


Lưu ý: Tested bằng Python 2.7 và Python 3

+2

Kết quả giống nhau trên Python 3. 'False' cho tương tác,' True' cho tập lệnh. – vaultah

+0

Python 3.3 hoạt động như 2,7. Thật thú vị, '>>> a = b; >>> a là b' trả về 'True'. – Davidmh

Trả lời

1

Sự khác biệt là, làm thế nào hằng được xử lý. Trong chế độ tương tác, không có cách nào để nói, nếu hằng số được đặt ở đó hay không. Nhưng đối với mã được biên dịch, mọi hằng số được lưu bên trong vào một bảng và các bản sao bị loại bỏ. Nhưng đây là một chi tiết thực hiện, và không cần phải đúng cho mọi phiên bản python.

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