Hãy xem xét chức năng sau.
def f(x):
x += n
return x * 4
Ở đây x
là tên địa phương, giá trị của nó có thể thay đổi. 4
là hằng số. Giá trị của nó sẽ không bao giờ thay đổi. Tuy nhiên, nó vẫn là một đối tượng và nó tốt hơn để cache chúng hơn là tạo một đối tượng mới mỗi lần nó cần thiết. Cuối cùng, n
là tham chiếu toàn cầu. Chuỗi "n"
được lưu trữ bởi hàm để nó có thể được sử dụng làm khóa để truy xuất n
từ ngữ cảnh chung của hàm.
>>> f.__code__.co_nlocals # just 1 (for x)
1
>>> f.__code__.co_consts
(None, 4)
>>> f.__code__.co_names
('n',)
>>> "n" in f.__globals__ and globals() is f.__globals__
True
Lý do giữ tên và tách riêng biệt là nhằm mục đích nội tâm. Lý do thực sự duy nhất để hợp nhất các bộ nhớ sẽ là hiệu quả bộ nhớ, mặc dù điều này sẽ chỉ giúp bạn có được một đối tượng và một con trỏ cho mỗi hàm. Hãy xem xét các chức năng sau đây.
def g():
return "s" * n
Nếu tuple chứa consts được sáp nhập với tên tuple chứa sau đó bạn (không phải VM) sẽ không thể để cho các giá trị đã cho globals truy cập và đó là hằng số của hàm.
Chỉ cần kiểm tra, bạn đang nói về cpython chính xác? Phiên bản nào? –
@GamesBrainiac: 'co_names' được sử dụng trong cpython cả 2 và 3 và trong pypy. Bạn không chắc chắn về các triển khai khác vì tôi không sử dụng chúng. – 6502
Tôi không nhớ tất cả những gì tốt, nhưng tôi khá chắc chắn nó có một cái gì đó để làm với tẩy. –