2016-04-27 71 views
1

我想知道:當返回字典時,python是否像JavaScript一樣行事?

def get_empty_cell(): 
    return {'p': [[], []], 'h': {}, 'b': []} 

def create_new_board(old_board): 
    height = len(old_board) + 4 
    width = len(old_board[0]) + 4 
    self.board = [None] * height 
    for i in range(0, height): 
     self.board[i] = [None] * width 
     for j in range(0, width): 
      # (!) deepcopy() 
      self.board[i][j] = copy.deepcopy(self.get_empty_cell()) 

我使用deepcopy的,因爲我已經在那裏不同的變量訪問相同的內容很多情況下。但是當Python返回類似於我的代碼的「新」字典時,如果我需要不同的單元格,還是像JavaScript一樣,是否需要使用copy.deepcopy

(和題外話:我敢肯定,我的代碼可以優化「Python的方式」 ......)

+0

'get_empty_cell()'每次調用時都會返回一個新的字典。所以你不需要copy.deepcopy。我很確定這種行爲幾乎在所有編程語言中都很常見。 – ozgur

回答

2

正如在另一個答案中,您不需要複製,因爲每次調用它時,get_empty_cell()都會返回一個新的dict

是的!你可以這樣優化你的代碼:

self.board = [[self.get_empty_cell() for j in range(width)] for i in range(height)] 
+0

AKS再次觸發**'; ^)'**但我在Pycharm中發出警告「j」和「i」未被使用。有沒有辦法寫一些像(沒有嘗試)'[[self.get_empty_cell()* width] * height]' –

+0

Thanks @OlivierPons!在你最後一個問題中,你也在爲這種優化而努力。爲了更好的理解,我建議你閱讀[list comprehensions](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)。 – AKS

+0

我想你可以這樣寫:'[[self.get_empty_cell()] * width] * height'但我不會建議,因爲那樣dict的相同副本將分配給每個單元格,並且如果修改了一個單元格所有將被修改。 – AKS

2

get_empty_cell()返回從字面每次新字典。沒有必要再複製一次。

+0

+1表示返回的字典是使用文字定義的。如果不是這種情況,即使每個單元格都是不同的字典,也可能會有幾個引用板中的同一個對象。 – Goyo

相關問題