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

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

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 удаляет элементы списка из другого списка. С МНОЖЕСТВЕННЫМИ ВОЗВРАТАМИ элементов в обоих
  • Ошибка синтаксиса Python - In и Not In List
  • если i! = 0 в понимании списка дает синтаксическую ошибку
  • Python: в чем разница между (1,2,3) и , и когда я должен использовать их?
  • Python: удаление элемента списка при повторении списка
  • Создание списка равномерно расположенных номеров в определенном диапазоне в python
  • Использование определения списка для соответствия значениям словарей, которые хранятся в списках
  • распечатывать элементы списка по строкам - возможно ли использование формата
  •  
    Interesting Posts for Van-Lav

    Необходимо закрыть сокет python / Найти текущий запущенный сервер в моей среде dev

    PyQt: удаление ненужных столбцов

    sys.stdout.write в python3 добавляет 11 в конец строки

    демона сельдерея – разрешено в файле журнала

    Pandas dataframe – текущая сумма с сбросом

    Python: threading + curve_fit: аргумент null для внутренней процедуры

    Остановка итерации без использования `break` в Python 3

    Django unique = True не работает

    Выход из Python Debugger ipdb

    Как я могу конкатенировать объекты str и int?

    Как получить значения параметров запроса get в колбе?

    UnboundLocalError при манипулировании переменными дает непоследовательное поведение

    Как скомпилировать несколько множественных регулярных выражений за один раз? Это более эффективно? – python

    python 3.2 как передавать данные в переменных между функциями

    Графика регистрации страницы границы фотографии (квазисканирование) книги. Какие алгоритмы, библиотеки в python использовать для обрезки?

    Python - лучший язык программирования в мире.