I'm remaking my battleship game, and I have a constant variable called SEA which holds an empty board. However, the variable is being modified, and I don't know why (or where). I suspect it's being passed by reference to player_board and when player_board is modified, so is SEA. How do I stop that from happening? Here is my code. You'll see on the bottom I print out SEA, and it's been modified.
from random import randint #Constants and globals OCEAN = "O" FIRE = "X" HIT = "*" SIZE = 10 SHIPS = [5, 4, 3, 3, 2] player_radar = [] player_board = [] player_ships = [] ai_radar = [] ai_board = [] ai_ships = [] #Classes class Ship(object): def set_board(self, b): self.ship_board = b def edit(self, row, col, x): self.ship_board[row][col] = x def __repre__(self): return self.ship_board #Set up variables last_ship = Ship() #Holds the last ship made in make_ship() SEA = [] # Blank Board for x in range(SIZE): SEA.append([OCEAN] * SIZE) #Functions def print_board(): for row in range(SIZE): print " ".join(player_radar[row]), "||" , " ".join(player_board[row]) def random_row(is_vertical, size): if is_vertical: return randint(0, SIZE - size) else: return randint(0, SIZE -1) def random_col(is_vertical, size): if is_vertical: return randint(0, SIZE - 1) else: return randint(size-1, SIZE -1) def exists(row, col, b): # true if ocean if row < 0 or row >= SIZE: return 0 elif col < 0 or col >= SIZE: return 0 if b[row][col] == OCEAN: return 1 else: return 0 def make_ship(size, board): #Find an unoccupied spot, then place ship on board #Also put ship in last_ship temp = [] temp = board is_vertical = randint(0, 1) # vertical ship if true occupied = True while(occupied): occupied = False ship_row = random_row(is_vertical, size) ship_col = random_col(is_vertical, size) if is_vertical: for p in range(size): if not exists(ship_row+p, ship_col, temp): occupied = True else: for p in range(size): if not exists(ship_row, ship_col-p, temp): occupied = True #Place ship on boards last_ship.set_board(SEA) if is_vertical: last_ship.edit(ship_row, ship_col, "^") last_ship.edit(ship_row+size-1, ship_col, "v") temp[ship_row][ship_col] = "^" temp[ship_row+size-1][ship_col] = "v" for p in range(size -2): last_ship.edit(ship_row+p+1, ship_col, "+") temp[ship_row+p+1][ship_col] = "+" else: last_ship.edit(ship_row, ship_col, ">") last_ship.edit(ship_row, ship_col-size+1, "<") temp[ship_row][ship_col] = ">" temp[ship_row][ship_col-size+1] = "<" for p in range(size -2): last_ship.edit(ship_row, ship_col-p-1, "+") temp[ship_row][ship_col-p-1] = "+" return temp # Make the boards player_radar = SEA player_board = SEA ai_radar = SEA ai_board = SEA print_board() for x in SHIPS: player_board = make_ship(x, player_board) #player_ships.append(last_ship) #ai_board = make_ship(x, ai_board) #ai_ships.append(last_ship) print "Let's play Battleship!" for row in range(SIZE): print " ".join(SEA[row])