Một câu hỏi đơn giản, có lẽ, nhưng tôi không thể cụm từ câu truy vấn Google của tôi để tìm câu trả lời ở đây. Tôi đã có thói quen tạo bản sao của đối tượng khi tôi chuyển chúng vào nhà xây dựng đối tượng, như vậy:Python có sao chép giá trị hoặc tham chiếu khi khởi tạo đối tượng không?
...
def __init__(self, name):
self._name = name[:]
...
Tuy nhiên, khi tôi chạy các mã kiểm tra sau, nó dường như không cần thiết, đó là Python đang thực hiện bản sao sâu của các giá trị đối tượng khi khởi tạo đối tượng:
>>> class Candy(object):
... def __init__(self, flavor):
... self.flavor = flavor
...
>>> flav = "cherry"
>>> a = Candy(flav)
>>> a
<__main__.Candy object at 0x00CA4670>
>>> a.flavor
'cherry'
>>> flav += ' and grape'
>>> flav
'cherry and grape'
>>> a.flavor
'cherry'
Vậy, câu chuyện có thật ở đây là gì? Cảm ơn!
EDIT:
Nhờ @Olivier cho câu trả lời tuyệt vời của mình. Các mã sau đây tài liệu một ví dụ tốt hơn mà Python không sao chép bằng cách tham khảo:
>>> flav = ['a','b']
>>> a = Candy(flav)
>>> a.flavor
['a', 'b']
>>> flav[1] = 'c'
>>> flav
['a', 'c']
>>> a.flavor
['a', 'c']
Để làm rõ, 'tự.flavor = flavor' không sao chép theo tham chiếu, nhưng vì chuỗi không thay đổi nên đối tượng được tham chiếu không thể thay đổi được. Do đó, 'flav + = 'và grape' thực sự tạo ra một đối tượng chuỗi mới và làm cho nó tham chiếu' flav'. – taleinat
@taleinat: cảm ơn, tôi đã cập nhật câu trả lời, hy vọng nó không gây nhầm lẫn. –
Cảm ơn các bạn đã trả lời. Tôi đoán sau đó, tôi vẫn còn tự hỏi nếu sao chép các đối tượng khi instantiation là một ý tưởng tốt, vì tôi không nhìn thấy nhiều nơi mà nó được thực hiện. Có đề xuất nào không? – daveslab