第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將值追加到 Python 成員變量

將值追加到 Python 成員變量

炎炎設(shè)計 2022-09-06 19:49:35
我是Python和OO編程的新手,所以請原諒,可能,設(shè)計得非常糟糕的代碼(任何提示將不勝感激)。在這個,人為的,MWE,這純粹是為了說明我的更大項目中的類似問題。我想遍歷3x3網(wǎng)格并填充它,以便它包含所有數(shù)字1-9,我唯一可以更改的值是當(dāng)前設(shè)置為0的值。即,如果網(wǎng)格當(dāng)前具有數(shù)字1-7并且兩個位置為0,則其中一個0變?yōu)?,一個變?yōu)?,在這種情況下,有兩個解決方案,因為8和9的順序也可以交換。我設(shè)計了一個回溯求解器(runSolver()),它確實解決了這個問題,我正在努力做的是在到達解決方案時存儲它們。我已經(jīng)添加了一個 print 語句,用于在達到解決方案時,這會按預(yù)期打印出解決方案,然后我嘗試將此解決方案追加到列表中,而不是追加剛剛找到的解決方案,而是追加初始的,未解決的網(wǎng)格。class Grid:    def __init__(self):        self.grid = np.zeros((3, 3))    def writeGrid(self, grid):        self.grid = grid    def printGrid(self):        print(self.grid)    def getValue(self, col, row):        return self.grid[row][col]    def setValue(self, col, row, num):        self.grid[row][col] = numclass Solver:    def __init__(self, grid):        self.grid = grid        self.solutions = []        self.n_solutions = 0    def isValid(self, num):        for i in range(3):            for j in range(3):                if self.grid.getValue(i, j) == num:                    return False        return True    def runSolver(self):        for row in range(3):            for col in range(3):                if (self.grid.getValue(col, row)) == 0:                    for num in range(1,10):                        if self.isValid(num):                            self.grid.setValue(col, row, num)                            self.runSolver()                            self.grid.setValue(col, row, 0)                    return        self.grid.printGrid()             # this line prints the actual solutions when reached (it works)        self.solutions.append(self.grid)  # this should append the solution to 'solutions'        self.n_solutions += 1             # keeps track of how many solutions there are實際顯示問題的主要功能是,# Set up gamegameGrid = Grid()gameGrid.writeGrid([[1, 4, 5],                    [0, 6, 0],                    [7, 8, 9]])solverGrid = Solver(gameGrid)# Run the solversolverGrid.runSolver()從一些在線搜索中,我認為我可能會混淆實例屬性和類屬性以及它們可訪問的范圍,但我真的不確定。
查看完整描述

1 回答

?
冉冉說

TA貢獻1877條經(jīng)驗 獲得超1個贊

當(dāng)您運行時,您基本上只需附加對 to 的引用。因此,在末尾,您有一個引用列表,因為它們都指向同一個對象。self.solutions.append(self.grid)self.gridself.solutionsrunSolverself.solutions


這與對象和Numpy數(shù)組都是可變對象的事實有關(guān)。與 Python 字符串相反,例如,當(dāng)您修改它們(例如)時,相同的對象將就地修改,而不是創(chuàng)建新對象。Gridself.grid.setValue(col, row, num)


下面是用列表列表說明的相同問題:


>>> l = []

>>> x = [1]

>>> l.append(x)

>>> l

[[1]]

>>> x.append(2)

>>> l.append(x)

>>> l

[[1, 2], [1, 2]]

每次添加網(wǎng)格時,都必須創(chuàng)建網(wǎng)格的副本,以便可以像當(dāng)時一樣獲得網(wǎng)格的“快照”。self.solutions


你可以做這樣的事情:


class Grid:


    def __init__(self, grid=None):

        if grid == None:

            self.grid = np.zeros((3, 3))

        else:

             # Copy the array, otherwise we'll have the same mutability issue as above.

            self.grid = np.copy(grid)

在:runSolver


        grid_copy = Grid(self.grid.grid)

        self.solutions.append(grid_copy) # this should append the solution to 'solutions'



查看完整回答
反對 回復(fù) 2022-09-06
  • 1 回答
  • 0 關(guān)注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號