Пушыстый (_winnie) wrote,
Пушыстый
_winnie

Злобная подножка в Питоне

Уже второй раз спотыкаюсь на этом в Python:
class MyClass:
	l = []
	i = 0

Теперь у каждого объекта MyClass будут поля l и i инициализированые тем, что указано в классе-"протипе".
НО!!!
	
a = MyClass()
b = MyClass()

a.i = 10
b.i = 20 #ok, всё предсказуемо

a.l.append(10)
b.l.append(20) #a.l и b.l содержат общий разделяемый список [10, 20]


Оба раза - час нервной отладки, что оно ведёт себя так, как вообще себя вести не может совершенно невероятным образом - изменение одного куска программы странным образом влияет на другой кусок программы (так как объект MyClass создаётся и влияет на общий список).

PS. Есть точно такой же момент с параметрами по умолчанию:
def my_funct(a, b, c = [])
   c.append('!')


Состояние списка c сохраняется между вызовами.

Про него я был заранее предупреждён в туториале, но вот к подставе с общим протипом, внутри которого разделяемые типы - оказался не готов.


Вот здесь hash_map более подробно и правильно объяснил, что происходит.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 41 comments