>>> 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 x1
và x2
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í 3
và 4
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 x2
và x1
sẽ giới thiệu đối tượng tuple cùng.
Và cách có * một bản sao * là: 'x2 = x1' ... –
@JonClements Đã bao gồm trong câu trả lời ngay bây giờ :-) – thefourtheye