Vâng, hãy để tôi cố gắng giải thích với một số hình ảnh.
Trong Python, mọi thứ đều là một đối tượng. Các đối tượng đó được tham chiếu theo biến. Một số loại đối tượng, chẳng hạn như danh sách và bộ dữ liệu, chỉ lưu trữ các tham chiếu đến các đối tượng khác.
Điều đó nói rằng, khi bạn thực hiện
myVar = ["jhhj", "hgc"]
myTuple = ([1,2,3], [4,5,6], myVar)
Bạn nhận được nhiều hay ít kịch bản này:

Mỗi đối tượng được thể hiện bằng một hộp/hình chữ nhật. Chúng tôi có hai đối tượng chuỗi, "jhhj"
và "hgc"
. Ngoài ra, chúng tôi có một đối tượng danh sách, được chỉ bởi biến số myVar
; danh sách đối tượng này trỏ tới cả hai đối tượng chuỗi. Ngoài ra, chúng tôi có một đối tượng tuple, được tham chiếu bởi myTuple
; đối tượng tuple này chỉ hai danh sách khác và danh sách được tham chiếu bởi myVar
.
Khi bạn thực hiện
myVar.append('lololol')
gì xảy ra? Vâng, đối tượng danh sách (có nghĩa là tình cờ được trỏ bởi myVar
) bắt đầu tham chiếu một giá trị nhiều hơn, các đối tượng chuỗi "lololol"
:

Lưu ý rằng myVar
vẫn tham chiếu đối tượng danh sách. Điều đã xảy ra là đối tượng danh sách đã thay đổi.Bạn có thể xem đối tượng danh sách này cả hai từ myVar
hoặc từ bộ tuple, bạn sẽ thấy cùng một đối tượng với cùng một thay đổi.
OTOH, khi bạn thực hiện
myVar = "lol"
myTuple = ([1,2,3], [4,5,6], myVar)
Bạn nhận được một cái gì đó như thế này:

Bây giờ myVar
điểm đến đối tượng chuỗi "lol"
, cũng như các tài liệu tham khảo tuple nó ở vị trí thứ ba . Bây giờ, nếu bạn thực hiện
myVar = "lolol"
bạn chỉ cần thực hiện myVar
để trỏ đến một đối tượng khác. Các đối tượng tuple vẫn trỏ tới "lol"
như trước:

Vì vậy, nếu bạn gán một giá trị mới cho một biến, nó sẽ chỉ thay đổi giá trị được trỏ bởi biến này. Giá trị trước đó được tham chiếu bởi biến sẽ vẫn tồn tại * và bất kỳ biến hoặc đối tượng nào trỏ đến nó sẽ vẫn trỏ đến nó. Chỉ biến phân bổ sẽ thay đổi.
PS: Ngoài ra, I answered a vaguely related question some time ago. Bạn có thể tìm thấy câu trả lời hữu ích.
* Trừ khi được thu thập bởi bộ thu gom rác, nhưng đây là một lịch sử lâu dài khác.
vậy làm thế nào đến phụ một danh sách sau đó trong chương trình sửa đổi tuple gốc? –
Bạn đang sửa đổi đối tượng danh sách bên trong tuple –
Bạn không sửa đổi bộ tuple. Bạn đang sửa đổi danh sách thành viên của một bộ tuple. Một cách hơi không chính xác, nhưng hữu ích để xem xét nó là một tuple '([1,2], [3,4])' thực sự là '(address_to_list1, address_to_list2)' Bạn không thể thay đổi địa chỉ, nhưng các danh sách là các đối tượng riêng biệt, có thể thay đổi. –