Я работал сегодня над простым скриптом, когда заметил странную причуду в том, как Python обрабатывает переменные экземпляра.
Допустим, у нас есть простой объект:
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"]
И мы создаем два экземпляра этого объекта с отдельными аргументами:
spam1 = Spam("Canadian bacon")
spam2 = Spam("American bacon")
print spam1
print spam2
Результаты вызывают недоумение:
My favorite type of bacon is American bacon
My favorite type of bacon is American bacon
Похоже, что словарь "яиц" используется всеми разными "спамами" "экземпляры - либо они, либо перезаписываются каждый раз при создании нового экземпляра. На самом деле это не проблема повседневной жизни, поскольку мы можем решить ее, объявив переменную экземпляра в функции инициализации:
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
С помощью код написан таким образом, результат такой, как мы и ожидали:
My favorite type of bacon is Canadian bacon
My favorite type of bacon is American bacon
Итак, хотя меня не сдерживает такое поведение, я не понимаю, почему Python работает таким образом. Может ли кто-нибудь пролить свет на это?