2014-12-13 12 views
9
>>> a=1 
>>> b=1 
>>> id(a) 
140472563599848 
>>> id(b) 
140472563599848 
>>> x=() 
>>> y=() 
>>> id(x) 
4298207312 
>>> id(y) 
4298207312 
>>> x1=(1) 
>>> x2=(1) 
>>> id(x1) 
140472563599848 
>>> id(x2) 
140472563599848 

cho đến thời điểm này tôi nghĩ sẽ chỉ có một bản sao của đối tượng bất biến và được chia sẻ (chỉ) bởi tất cả các biến.Nội bộ cho các bộ mã vạch python

Nhưng khi tôi thử, các bước dưới đây tôi hiểu rằng tôi đã sai.

>>> x1=(1,5) 
>>> y1=(1,5) 
>>> id(x1) 
4299267248 
>>> id(y1) 
4299267320 

ai cũng có thể giải thích cho tôi về nội bộ không?

Trả lời

9
>>> x1=(1) 
>>> x2=(1) 

là thực sự giống như

>>> x1=1 
>>> x2=1 

Trong Python, smaller numbers are internally cached. Vì vậy, chúng sẽ không được tạo trong bộ nhớ nhiều lần. Đó là lý do tại sao id s của x1x2 là như nhau cho đến thời điểm này.

, trong đó yếu tố tuple nên có một dấu phẩy ở cuối, như thế này

>>> x1=(1,) 
>>> x2=(1,) 

Khi bạn làm điều này, có hai bộ dữ liệu mới được xây dựng chỉ với một yếu tố trong đó. Mặc dù các phần tử bên trong các bộ dữ liệu giống nhau, chúng đều là các bộ dữ liệu khác nhau. Đó là lý do tại sao cả hai đều có số khác nhau là id s.

Cho phép lấy ví dụ cuối cùng của bạn và tháo rời mã.

compiled_code = compile("x1 = (1, 5); y1 = (1, 5)", "string", "exec") 

Bây giờ,

import dis 
dis.dis(compiled_code) 

sẽ tạo ra một cái gì đó như thế này

1   0 LOAD_CONST    3 ((1, 5)) 
       3 STORE_NAME    0 (x1) 
       6 LOAD_CONST    4 ((1, 5)) 
       9 STORE_NAME    1 (y1) 
      12 LOAD_CONST    2 (None) 
      15 RETURN_VALUE 

Nó tải một giá trị không đổi, được gọi bởi các chỉ số 3, đó là (1, 5) và sau đó lưu trữ nó trong x1. Cùng một cách, nó tải một giá trị không đổi khác, tại chỉ số 4 và lưu trữ nó trong y1. Nếu chúng ta nhìn vào danh sách các hằng số trong đối tượng mã,

print(compiled_code.co_consts) 

sẽ cho

(1, 5, None, (1, 5), (1, 5)) 

Các yếu tố tại các vị trí 34 là tuples mà chúng tôi tạo ra trong mã thực tế. Vì vậy, Python không chỉ tạo một cá thể cho mọi đối tượng bất biến, luôn là. Đó là một chi tiết thực hiện mà chúng tôi không phải lo lắng nhiều về anyway.

Lưu ý: Nếu bạn muốn chỉ có một thể hiện của một đối tượng không thay đổi, bạn có thể tự làm điều đó như thế này

x1 = (1, 5) 
x2 = x1 

Bây giờ, cả hai x2x1 sẽ giới thiệu đối tượng tuple cùng.

+1

Và cách có * một bản sao * là: 'x2 = x1' ... –

+1

@JonClements Đã bao gồm trong câu trả lời ngay bây giờ :-) – thefourtheye

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