Создание отдельных объектов в функции

Взгляните на следующий фрагмент кода:

class MyObj(object): name = "" def __init__(self, name): self.name = name v = [ {} ] * 2 def f(index): v[index]['surface'] = MyObj('test') v[index]['num'] = 3 if __name__ == '__main__': f(0) f(1) v[0]['num'] = 4 print v[1]['num'] 

То, что я ожидал получить в качестве вывода последней строки, равно 3 ; однако он печатает 4 . Поэтому это должно означать, что новый объект создается всегда на том же ссылочном адресе.

Как я могу избежать такого поведения? (т. е. как я могу сделать вышеприведенные отпечатки кода 4?)

Вам нужно создать два слова:

 v = [ {},{} ] 

Или используйте цикл:

 v = [ {} for _ in range(2)] 

Вы создаете две ссылки на один и тот же объект.

 In [2]: a = [{}] * 2 In [3]: id(a[0]) Out[3]: 140209195751176 In [4]: id(a[1]) Out[4]: 140209195751176 In [5]: a[0] is a[1] Out[5]: True In [6]: a = [{} for _ in range(2)] In [7]: id(a[1]) Out[7]: 140209198435720 In [8]: id(a[0]) Out[8]: 140209213918728 In [9]: a[0] is a[1] Out[9]: False