Tôi đã làm việc trên một kịch bản đơn giản ngày hôm nay khi tôi nhận thấy một quirk lạ trong cách Python xử lý các biến mẫu.Tại sao Python dường như coi các biến mẫu như được chia sẻ giữa các đối tượng?
Giả sử chúng ta có một đối tượng đơn giản:
class Spam(object):
eggs = {}
def __init__(self, bacon_type):
self.eggs["bacon"] = bacon_type
def __str__(self):
return "My favorite type of bacon is " + self.eggs["bacon"]
Và chúng ta tạo ra hai trường hợp của đối tượng này với đối số riêng biệt:
spam1 = Spam("Canadian bacon")
spam2 = Spam("American bacon")
print spam1
print spam2
Các kết quả được đánh đố:
My favorite type of bacon is American bacon
My favorite type of bacon is American bacon
Nó có vẻ như từ điển "trứng" được chia sẻ giữa tất cả các phiên bản "Spam" khác nhau - hoặc là ghi đè mỗi khi một cá thể mới được tạo ra. Đây không phải là thực sự là một vấn đề trong cuộc sống hàng ngày, vì chúng ta có thể giải quyết nó bằng cách tuyên bố biến dụ trong hàm khởi tạo:
class Spam(object):
def __init__(self, bacon_type):
self.eggs = {}
self.eggs["bacon"] = bacon_type
def __str__(self):
return "My favorite type of bacon is " + self.eggs["bacon"]
spam1 = Spam("Canadian bacon")
spam2 = Spam("American bacon")
print spam1
print spam2
Với mã bằng văn bản theo cách này, kết quả là những gì chúng ta mong đợi:
My favorite type of bacon is Canadian bacon
My favorite type of bacon is American bacon
Vì vậy, trong khi tôi không bị giữ bởi hành vi này, tôi không hiểu tại sao Python hoạt động theo cách này. Bất cứ ai có thể làm sáng tỏ về điều này?
bản sao có thể có của [Làm thế nào để tránh có dữ liệu lớp Python được chia sẻ giữa các trường hợp?] (Http://stackoverflow.com/questions/1680528/how-do-i-avoid-having-python-class-data-shared -among-instances) –