Поведение странного списка в классе

Я написал класс, который имеет список как переменную. У меня есть функция, которая добавляет к этому списку и функцию, которая выводит этот список.

class MyClass: myList = [] def addToList(self, myNumber): self.myList.append(myNumber) def outputList(self): for someNumber in self.myList: print someNumber 

Теперь по какой-то странной причине, если я объявляю два отдельных объекта класса:

 ver1 = MyClass() ver2 = MyClass() 

а затем вызовите addToList в ver1:

 ver1.addToList(3) 

а затем вывести список ver2:

 ver2.outputList() 

Я получаю 3 в качестве вывода для списка версии 2! Что происходит?

4 Solutions collect form web for “Поведение странного списка в классе”

Ваш синтаксис неверен. Вы используете переменную class-static. Учти это:

 class MyClass: myList = [] # Static variable def __init__(self): self.myRealList = [] # Member variable 

myList на самом деле является частью определения MyClass и, следовательно, отображается не только по имени класса, но и всем экземплярам этого класса:

 c = MyClass() c.myList = [1] print MyClass.myList # will print [1] 

Вам нужно объявить регулярные «переменные-члены» в конструкторе __init__ .

Не чувствую себя плохо, я пришел к python из мира C / C ++ / C #, совершил ту же ошибку, и сначала это смутило меня.

Проблема в том, что mylist инициализируется при анализе файла. Поэтому каждая последующая инициализация MyClass будет иметь одинаковую ссылку на тот же самый список.

 class MyClass: myList = [] 

Вместо этого вы должны инициализировать его классом.

 class MyClass: def __init__(self): self.myList = [] 

myList на самом деле является переменной класса (я не знаю, для этого это термин Pythonic), потому что он объявлен вне любой функции.

Чтобы создать переменную instance-local (еще раз, я не знаю правильного термина), вы должны инициализировать ее в методе init, например, self.myList = [] ".

Пожалуйста, отредактируйте любое плохое форматирование с моей стороны, я нахожусь на своем телефоне.

Здесь происходит несколько вещей. Вы можете иметь переменные экземпляра или класса в python. В вашем примере myList – это переменная класса, которая является статической для всех экземпляров. Существуют также переменные экземпляра, которые являются локальными для класса, и вы можете переопределить переменные класса с переменными экземпляра. Вот пример:

 class Foo: bar = 'Hello' # Class variable def __init__(self): self.foobar = 'Hello World' # instance variable def createInstanceBar(self, x): self.bar = x # Override class variable and create instance variable a = Foo() b = Foo() print a.bar # Prints Hello print b.bar # Prints Hello print a.foobar # Prints Hello World print b.foobar # Prints Hello World a.createInstanceBar('Hello New World') print a.bar # Prints Hello New World print b.bar # Prints Hello 
  • Python - использование оператора умножения для создания копий объектов в списках
  • Преобразование списка Python
  • Объединение 2 списков в python
  • индекс списка вне диапазона
  • Доступ к значению в кортеже, который находится в списке
  • Перечислять два списка python одновременно?
  • python: создать список кортежей из списков
  • Python: удаление пробелов из объектов списка
  • Python - лучший язык программирования в мире.