Python có thể sử dụng lại vị trí bộ nhớ.
Khi bạn chạy:
id(1.1)
bạn tạo một giá trị float, xin id()
của nó, và sau đó Python xóa giá trị một lần nữa bởi vì không có gì liên quan đến nó. Khi bạn sau đó tạo một giá trị float, Python có thể tái sử dụng các vị trí bộ nhớ tương tự và do đó id(2.2)
có thể trả về giá trị tương tự cho id()
:
>>> id(1.1)
140550721129024
>>> id(2.2)
140550721129024
Làm điều này thay vì:
float_one, float_two = 1.1, 2.2
print id(float_one), id(float_two)
Bây giờ float giá trị có tham chiếu đến chúng (hai biến) và sẽ không bị phá hủy, và bây giờ họ có vị trí bộ nhớ khác nhau và do đó id()
giá trị.
Lý do bạn thấy các giá trị id()
khác nhau cho các số nguyên nhỏ (từ -5 đến 256) là vì these values are interned; Python chỉ tạo một đối tượng số1
số nguyên và tái sử dụng nó nhiều lần. Kết quả là, các số nguyên này đều có một địa chỉ bộ nhớ duy nhất, như trình thông dịch Python đã đề cập đến chúng, và sẽ không xóa chúng cho đến khi trình thông dịch thoát ra.
Nguồn
2013-06-16 09:57:13
Ah vâng, tôi đang ở trong ipython nơi các số được lưu trong Out! :) –
Cảm ơn @MartijnPieters. – ehsandotnet
Lưu ý rằng việc thực hiện các số nguyên nhỏ này có lẽ là một tính năng của CPython _implementation_ chứ không phải là một thuộc tính được bảo đảm của ngôn ngữ. Trong trường hợp này, nó tương tự như các giá trị NSInteger nhỏ (0 đến 12 từ bộ nhớ) trong một số triển khai Objective-C, nơi mọi người đã tự hỏi về số lượng giữ lại lạ. Và, như vậy, có lẽ không phải là một ý tưởng tốt để dựa vào việc thực tập này. – paxdiablo