Không, bạn không thể. Như câu trả lời khác chỉ ra, bạn có thể (ab?) Sử dụng bí danh của các đối tượng có thể thay đổi để đạt được một hiệu ứng tương tự. Tuy nhiên, đó không phải là điều tương tự như tài liệu tham khảo C++, và tôi muốn giải thích những gì thực sự xảy ra để tránh bất kỳ quan niệm sai lầm nào.
Bạn thấy, trong C++ (và các ngôn ngữ khác), biến (và trường đối tượng và mục nhập trong bộ sưu tập, v.v.) là vị trí lưu trữ và bạn viết giá trị (ví dụ: số nguyên, đối tượng hoặc một con trỏ) đến vị trí đó. Trong mô hình này, tham chiếu là bí danh cho vị trí lưu trữ (bất kỳ loại nào) - khi bạn gán cho biến không tham chiếu, bạn sao chép giá trị (ngay cả khi nó chỉ là con trỏ, nó vẫn là giá trị) cho vị trí lưu trữ; khi bạn gán cho một tham chiếu, bạn sao chép vào một vị trí lưu trữ ở một nơi khác. Lưu ý rằng bạn không thể thay đổi một tham chiếu - một khi nó bị ràng buộc (và nó phải ngay sau khi bạn tạo một) tất cả các nhiệm vụ cho nó thay đổi không phải là tham chiếu nhưng bất cứ điều gì được nhắc tới.
Trong Python (và các ngôn ngữ khác), một biến (và trường đối tượng và mục nhập trong bộ sưu tập, v.v.) chỉ là một tên. Giá trị là ở đâu đó khác (ví dụ: rắc khắp đống) và biến tham chiếu (không theo nghĩa của tham chiếu C++, giống như con trỏ trừ số học con trỏ) thành giá trị. Nhiều tên có thể tham chiếu đến cùng một giá trị (thường là một điều tốt). Python (và các ngôn ngữ khác) gọi bất cứ điều gì là cần thiết để tham chiếu đến một giá trị một tham chiếu, mặc dù là khá không liên quan đến những thứ như C++ tài liệu tham khảo và pass-by-tham khảo. Chỉ định cho một biến (hoặc trường đối tượng, hoặc ...) đơn giản chỉ làm cho nó tham chiếu đến một giá trị khác.Toàn bộ mô hình vị trí lưu trữ không áp dụng cho Python, lập trình viên không bao giờ xử lý các vị trí lưu trữ cho các giá trị. Tất cả các cửa hàng và shuffles xung quanh là tài liệu tham khảo Python, và những người không phải là giá trị trong Python, vì vậy họ không thể được nhắm mục tiêu của tài liệu tham khảo Python khác.
Tất cả điều này là độc lập với tính đột biến của giá trị - ví dụ như đối với int và danh sách. Bạn không thể lấy một biến đề cập đến một trong hai, và ghi đè lên đối tượng nó trỏ đến. Bạn chỉ có thể yêu cầu đối tượng sửa đổi các phần của chính nó - giả sử thay đổi một số tham chiếu chứa nó.
Đây có phải là mô hình hạn chế hơn không? Có lẽ, nhưng nó đủ mạnh hầu hết thời gian. Và khi nó không phải là bạn có thể làm việc xung quanh nó, hoặc với một lớp tùy chỉnh giống như một lớp dưới đây, hoặc (tương đương, nhưng ít rõ ràng hơn) một bộ sưu tập phần tử đơn.
class Reference:
def __init__(self, val):
self._value = val # just refers to val, no copy
def get(self):
return self._value
def set(self, val):
self._value = val
Đó vẫn sẽ không cho phép bạn bí danh là "thường xuyên" lĩnh vực biến hoặc đối tượng, nhưng bạn có thể có nhiều biến đề cập đến cùng một đối tượng Reference
(như trên cho giải pháp thay thế có thể thay đổi-singleton thu). Bạn chỉ cần cẩn thận để luôn sử dụng .get()
/.set()
(hoặc [0]
).
Giải thích tốt, +1 để làm rõ rằng nó không liên quan gì đến tính đột biến. –