Почему кажется, что Python рассматривает переменные экземпляра как общие для объектов?

Я работал сегодня над простым скриптом, когда заметил странную причуду в том, как 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 работает таким образом. Может ли кто-нибудь пролить свет на это?

6
задан lionel b 14 January 2012 в 05:52
поделиться