2016-04-27 69 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

相关问题