Как после создания новой скопированной переменной, не изменить старую?
Имеется такой генератор
import time
import itertools
import random
def main(size):
global global_board
global global_board_clear
size = int(size)
L = []
for i in range(1, size + 1):
L.append(i)
per = list(itertools.permutations(L))
number = random.randint(0, len(per))
boardd = [[0] * (size + 2) for j in range(size + 2)]
lst_4 = [[2, 3, 2, 4, 1, 2], [1, 4, 1, 3, 2, 3], [3, 1, 3, 2, 4, 1], [2, 2, 4, 1, 3, 2]]
lst_5 = [[2, 3, 5, 1, 4, 2, 3], [3, 2, 1, 3, 5, 4, 2], [2, 4, 2, 5, 3, 1, 3],
[4, 1, 3, 4, 2, 5, 1], [1, 5, 4, 2, 1, 3, 3]]
lst_6 = [[4, 3, 4, 1, 2, 5, 6, 1], [4, 2, 3, 4, 1, 6, 5, 2], [2, 5, 6, 3, 4, 1, 2, 3],
[1, 6, 1, 5, 3, 2, 4, 3], [3, 4, 5, 2, 6, 3, 1, 3], [3, 1, 2, 6, 5, 4, 3, 4]]
lst_7 = [[3, 5, 1, 6, 7, 2, 4, 3, 3, ], [3, 4, 2, 1, 5, 7, 3, 6, 2],
[2, 1, 7, 3, 6, 4, 5, 2, 4], [2, 6, 5, 4, 3, 1, 2, 7, 1], [3, 3, 6, 7, 2, 5, 1, 4, 3],
[1, 7, 4, 2, 1, 3, 6, 5, 3], [5, 2, 3, 5, 4, 6, 7, 1, 2]]
lst_8 = [[1, 8, 7, 6, 4, 1, 5, 3, 2, 6], [2, 5, 8, 7, 3, 2, 6, 1, 4, 4],
[2, 6, 3, 2, 8, 4, 7, 5, 1, 4], [4, 1, 4, 3, 2, 7, 8, 6, 5, 3],
[2, 7, 5, 1, 6, 3, 4, 2, 8, 1], [2, 2, 1, 8, 7, 5, 3, 4, 6, 3],
[3, 4, 6, 5, 1, 8, 2, 7, 3, 3], [5, 3, 2, 4, 5, 6, 1, 8, 7, 2]]
lst_9 = [[4, 2, 3, 8, 1, 5, 9, 6, 4, 7, 2], [3, 3, 6, 9, 7, 4, 8, 5, 1, 2, 4],
[3, 7, 8, 4, 5, 3, 1, 9, 2, 6, 2], [2, 6, 5, 3, 9, 1, 2, 4, 7, 8, 2],
[2, 8, 4, 1, 3, 6, 7, 2, 9, 5, 2], [3, 4, 7, 5, 2, 9, 6, 8, 3, 1, 4],
[2, 5, 9, 2, 6, 7, 4, 1, 8, 3, 3], [1, 9, 1, 6, 8, 2, 3, 7, 5, 4, 5],
[5, 1, 2, 7, 4, 8, 5, 3, 6, 9, 1]]
if size == 4:
lst = lst_4
elif size == 5:
lst = lst_5
elif size == 6:
lst = lst_6
elif size == 7:
lst = lst_7
elif size == 8:
lst = lst_8
elif size == 9:
lst = lst_9
for i in range(1, size + 1):
boardd[i] = lst[per[number][i - 1] - 1]
boardd[0][0] = -1
boardd[0][-1] = -1
boardd[-1][0] = -1
boardd[-1][-1] = -1
for j in range(1, size + 1):
curr = boardd[1][j]
heig = 1
for i in range(1, size + 1):
if boardd[i][j] > curr:
curr = boardd[i][j]
heig += 1
boardd[0][j] = heig
for j in range(1, size + 1):
curr = boardd[-2][j]
heig = 1
for i in range(1, size + 1):
if boardd[-i - 1][j] > curr:
curr = boardd[-i - 1][j]
heig += 1
boardd[-1][j] = heig
global_board = boardd
print(boardd)
board_clear = boardd[:]
for v in range(1, size + 1):
#print(boardd)
for f in range(1, size + 1):
#print(boardd)
board_clear[v][f] = 0
boardd_clear = board_clear
global_board_clear = boardd_clear
print(board_clear)
print(boardd)
main(4)
После трех print, вывод в консоль:
[[-1, 2, 3, 1, 2, -1], [2, 3, 2, 4, 1, 2], [3, 1, 3, 2, 4, 1], [2, 2, 4, 1, 3, 2], [1, 4, 1, 3, 2, 3], [-1, 1, 2, 2, 3, -1]]
[[-1, 2, 3, 1, 2, -1], [2, 0, 0, 0, 0, 2], [3, 0, 0, 0, 0, 1], [2, 0, 0, 0, 0, 2], [1, 0, 0, 0, 0, 3], [-1, 1, 2, 2, 3, -1]]
[[-1, 2, 3, 1, 2, -1], [2, 0, 0, 0, 0, 2], [3, 0, 0, 0, 0, 1], [2, 0, 0, 0, 0, 2], [1, 0, 0, 0, 0, 3], [-1, 1, 2, 2, 3, -1]]
Вопрос: Почему boardd меняется на board_clear и как его можно оставить прежним, чтобы вывод в консоль был такой:
[[-1, 2, 3, 1, 2, -1], [2, 3, 2, 4, 1, 2], [3, 1, 3, 2, 4, 1], [2, 2, 4, 1, 3, 2], [1, 4, 1, 3, 2, 3], [-1, 1, 2, 2, 3, -1]]
[[-1, 2, 3, 1, 2, -1], [2, 0, 0, 0, 0, 2], [3, 0, 0, 0, 0, 1], [2, 0, 0, 0, 0, 2], [1, 0, 0, 0, 0, 3], [-1, 1, 2, 2, 3, -1]]
[[-1, 2, 3, 1, 2, -1], [2, 3, 2, 4, 1, 2], [3, 1, 3, 2, 4, 1], [2, 2, 4, 1, 3, 2], [1, 4, 1, 3, 2, 3], [-1, 1, 2, 2, 3, -1]]
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Есть переменные мутабельные, а есть нет.
Присваивание не копирует сам массив, а только дает ссылку на указатель.
Чтоб скопировать массивы, словари и прочие сложные объекты используйте copy() или deepcopy()
Или пересоздайте новый список через for.. in:for.. in...