Почему при наследовании редактируется значение предка?
Написал такой код для примера:
FIELD_SIZE = (2, 2)
GAME_FIELD = [[1 for x in range(FIELD_SIZE[0])] for y in range(FIELD_SIZE[1])]
class Field(list):
def __init__(self, *args):
super().__init__(*args)
def clear(field):
for y in range(FIELD_SIZE[1]):
for x in range(FIELD_SIZE[0]):
field[y][x] = 0
field = Field(GAME_FIELD)
clear(field)
print(GAME_FIELD)
print(field)
[[0, 0], [0, 0]]
[[0, 0], [0, 0]]
Но, ведь, я редактировал field, а не GAME_FIELD
По логике же должно получиться
[[1, 1], [1, 1]]
[[0, 0], [0, 0]]
Как мне редактировать только field, что б GAME_FIELD оставалась неизменной?
Ответы (1 шт):
Замените строку
field = Field(GAME_FIELD)
на такое:
from copy import deepcopy
field = Field(deepcopy(GAME_FIELD))
И наследование тут не при чём, если бы вы так же использовали бы список
l = list(GAME_FIELD)
clear(l)
то у вас была бы точно такая же проблема.
Тут всё дело в том, что когда вы куда-то передаёте список, то у вас там будет именно сам этот список, а не его копия. И если вы манипулируете его элементами, то эти изменения будут видны всюду, где используется этот список.
Поэтому когда вам нужна отдельная копия списка, не связанная с изначальным списком, его нужно явно копировать. А если в нём есть вложенные списки - то копировать обязательно с помощью deepcopy.