2017-07-22 35 views

Trả lời

17

Việc triển khai CPython của Python lưu trữ các giá trị không đổi (chẳng hạn như số, chuỗi, tuple hoặc frozensets) được sử dụng trong một hàm làm tối ưu hóa. Bạn có thể quan sát chúng qua func.__code__.co_consts:

>>> def get_tuple(): 
...  return (1,) 
... 
>>> get_tuple.__code__.co_consts 
(None, 1, (1,)) 

Như bạn thấy, đối với chức năng này các hằng None (đó là giá trị trả về mặc định), 1(1,) được lưu trữ. Vì hàm trả về một trong số chúng, bạn sẽ có cùng một đối tượng chính xác với mọi cuộc gọi.

Bởi vì đây là chi tiết triển khai CPython, nó không được đảm bảo bằng ngôn ngữ Python. Đó có lẽ là lý do tại sao bạn không thể tìm thấy nó trong tài liệu hướng dẫn :)

0

Có thể do địa chỉ trong bộ nhớ. Chỉ cần cố in chúng qua print memory address of Python variable

+3

@Kristofee yes cho mỗi cuộc gọi nó trả về giống nhau, nhưng tôi không thể hiểu tại sao, bởi vì tôi mong đợi mỗi cuộc gọi hàm sẽ trả về đối tượng mới. –

6

Python tối ưu hóa giá trị trả về.
Bởi vì người thông dịch dễ dàng thấy rằng bộ trả về sẽ giống nhau mỗi lần, và nó là một đối tượng bất biến, nó trả về cùng một đối tượng (cùng một chính xác. Cùng một địa chỉ bộ nhớ).
Ở đây, khi bạn thực hiện a is b, bạn thực sự yêu cầu id(a) == id(b).

+1

Bạn có biết cách tìm nó trong tài liệu Python không? –

+7

Điều quan trọng cần lưu ý là các triển khai * cụ thể * của Python có thể thực hiện tối ưu hóa như vậy. Bản thân ngôn ngữ không đảm bảo như vậy. – chepner

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