返回字典时,python的行为是否与JavaScript类似?
我想知道:返回字典时,python的行为是否与JavaScript类似?,javascript,python,Javascript,Python,我想知道: 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.
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方式”进行优化)
get\u empty\u cell()
每次都从一个文本返回一个新字典。无需再次复制。获取空单元格()
每次从文本返回一个新词典。没有必要再复制它。与另一个答案一样,您不需要复制,因为get\u empty\u cell()
每次调用它时都会返回一个新的dict
是的!您可以像这样优化代码:
self.board = [[self.get_empty_cell() for j in range(width)] for i in range(height)]
与另一个答案一样,您不需要复制,因为
get\u empty\u cell()
每次调用时都会返回一个新的dict
是的!您可以像这样优化代码:
self.board = [[self.get_empty_cell() for j in range(width)] for i in range(height)]
get\u empty\u cell()。所以你不需要复制,在那里复制。我确信这种行为几乎在所有编程语言中都很常见。get\u empty\u cell()。所以你不需要复制,在那里复制。我很确定这种行为几乎在所有编程语言中都很常见。AKS再次攻击;^)代码>但是我在Pycharm中得到一个警告,“j”和“I”没有被使用。有没有一种方法可以写这样的东西(没有尝试过)[[self.get\u empty\u cell()*width]*height]
谢谢@OlivierPons!在你的上一个问题中,你也在为这种类型的优化而挣扎。为了更好地理解,我建议您阅读一下。我认为您可以这样写:[[self.get\u empty\u cell()]*width]*height
,但我不建议这样做,因为这样一来,相同的dict副本将分发到每个单元格,如果您修改一个单元格,所有单元格都将被修改。好的。再次感谢。如果您不想收到这些警告,请查看。AKS再次罢工;^)代码>但是我在Pycharm中得到一个警告,“j”和“I”没有被使用。有没有一种方法可以写这样的东西(没有尝试过)[[self.get\u empty\u cell()*width]*height]
谢谢@OlivierPons!在你的上一个问题中,你也在为这种类型的优化而挣扎。为了更好地理解,我建议您阅读一下。我认为您可以这样写:[[self.get\u empty\u cell()]*width]*height
,但我不建议这样做,因为这样一来,相同的dict副本将分发到每个单元格,如果您修改一个单元格,所有单元格都将被修改。好的。再次感谢。如果您不想收到这些警告,请查看一下。+1表示返回的字典是使用文字定义的。如果情况并非如此,那么即使每个单元格是不同的字典,电路板中也可能有多个对同一对象的引用。+1表示返回的字典是使用文字定义的。如果不是这样的话,即使每个单元格是不同的字典,电路板中也可能有多个对同一对象的引用。