Klaida priskiriant du savo kintamuosius vienas kitam pythone

Dirbu kuriant 2048 žaidimą ir bandau sukurti stabdymo sąlygą. Tačiau susiduriate su dviem kintamaisiais. Idėja, kurią bandžiau, buvo paprasta: sustabdyti vykdymą, kai dvi matricos reikšmės (kuriose yra dabartinės 4x4 lentos vertės ir kitos ankstesnės pakopos vertės) yra vienodos.

Taigi šis kodas iš esmės buvo toks.

 import numpy as np import random class Board(): def __init__(self): self.board = np.zeros((4,4), dtype = np.int) self.prev_board = np.zeros((4,4), dtype = np.int) self.new_game() print("New Board Created") self.newgame = False def new_game(self): for cnt in range(2): i = random.randint(0,3) j = random.randint(0,3) self.board[i][j] = random.choice([2,4]) def populate(self): empty = [] for i in range(4): for j in range(4): if self.board[i][j] == 0: empty.append([i,j]) i,j = random.choice(empty) self.board[i][j] = random.choice([2,4]) def move(self,board): k = 0 for row in board: new_col = np.zeros(len(row), dtype=row.dtype) j = 0 previous = None for i in range(row.size): if row[i] != 0: if previous == None: previous = row[i] else: if previous == row[i]: new_col[j] = 2 * row[i] j += 1 previous = None else: new_col[j] = previous j += 1 previous = row[i] if previous != None: new_col[j] = previous board[k] = new_col k += 1 return board def next_move(self,direction): rotated_board = np.rot90(self.board, direction) rotated_board = self.move(rotated_board) self.board = np.rot90(rotated_board, -direction) def play_game(self,direction): self.next_move(direction) self.prev_board = self.board print("Before populate") print(self.prev_board) self.populate() print("After populate") print(self.prev_board) game = Board() for i in range(2): game.play_game(0) 

Tai metodas, kuris atlieka vieną žaidimo žingsnį, ir šis metodas vėl vadinamas, kol bus gauti sustabdymo kriterijai, kaip aptarta aukščiau. Problema ta, kad bandydamas tokiu būdu, self.prev_board vertė pasikeičia prieš ir po skambučio „self.populate“ (). Tiesiog nesupraskite, kas vyksta.

Išėjimo signalas

 Before populate [[0 0 0 0] [2 0 0 0] [0 0 0 0] [2 0 0 0]] After populate [[0 0 0 0] [2 0 0 0] [0 0 0 0] [2 0 4 0]] Before populate [[0 0 0 0] [2 0 0 0] [0 0 0 0] [2 4 0 0]] After populate [[0 0 0 0] [2 0 2 0] [0 0 0 0] [2 4 0 0]] 

PS: self.next_move (kryptis) - daro kitą žingsnį ir self.populate () - užpildo naują atsitiktinę vertę matricoje.

1
02 марта '18 в 5:14 2018-03-02 05:14 „codegooner“ yra nustatytas kovo 2 d. 18 val. 5:14 2018-03-02 05:14
@ 2 atsakymai

https://docs.python.org/2/library/copy.html

Python priskyrimo pareiškimai nekopijuoja objektų, jie sukuria ryšius tarp objekto ir objekto. Kolekcijoms, kurios keičia arba turi redaguojamų elementų, kartais reikalinga kopija, todėl galite pakeisti vieną kopiją nekeičiant kito. Šiame modulyje pateikiamos bendros operacijos su sekliu ir giliu kopijavimu (paaiškinta toliau).

Trumpas sąsajos aprašymas:

copy.copy (x) Grąžinkite nedidelę x kopiją.

copy.deepcopy (x) Grąžinkite gilią x kopiją.

Jei norite padėti išspręsti problemą, perskaitykite aukščiau pateiktą nuorodą.

0
02 марта '18 в 5:20 2018-03-02 05:20 atsakymą RockeArm pateikia kovo 2 d. 18 val. 5:20 ; 2018-03-02 05:20

Jei teisingai suprantu, jūsų problema kyla, kai bandote kopijuoti „ self.board kintamąjį į self.prev_board . „Python“ pagal nutylėjimą naudoja režimą „pass by reference“, kai jis pereina tarp dviejų kintamųjų. Taigi, bet koks self.board taip pat pakeis self.prev_board . Ji tikrai nekopijuoja vertės, bet tik susieja

Tai galite išvengti, įdėdami [:] arba naudodami copy arba deepcopy copy .

  def play_game(self,direction): self.next_move(direction) self.prev_board = self.board[:] print(self.prev_board) self.populate() print(self.prev_board) 

naudoti gilias kopijas:

 from copy import deepcopy def play_game(self,direction): self.next_move(direction) self.prev_board = deepcopy(self.board) print(self.prev_board) self.populate() print(self.prev_board) 
0
02 марта '18 в 5:21 2018-03-02 05:21 atsakymas pateikiamas malioboro 02 kovo 18 d. 5:21 2018-03-02 05:21

Kiti klausimai apie „ žymes arba klausimo pateikimas