Python字典创建对象内存地址重复问题求助
解决迷宫游戏中单元格实例共享的问题
嘿,我一眼就看出问题出在哪了——你在types_of_cells字典里存的是已经实例化好的对象,而不是类本身!
你看,当你写"W": Water()的时候,这行代码会立刻创建一个Water类的实例,然后把这个实例的引用存在字典里。所以不管你从字典里取多少次"W"对应的值,拿到的都是同一个对象,所有Water单元格自然共享同一个内存地址,改一个就全变了。
怎么改?
很简单,把字典里的值换成类本身,而不是实例。然后在需要创建单元格的时候,再调用类的构造方法生成新实例:
# 这里存类,不是实例! types_of_cells = { "S": Start, "F": Finish, " ": Blank, "-": Wall, "W": Water } i = 0 cell_list = [] while i < len(lines): cell_list.append(list(lines[i].strip())) j = 0 while j < len(cell_list[i]): if cell_list[i][j] in types_of_cells: # 这里调用类的构造方法,每次都新建一个实例 cell = types_of_cells[cell_list[i][j]]() cell_list[i][j] = cell j += 1 i += 1
这样一来,每个单元格都是独立的实例,内存地址各不相同。当你走过某个Water单元格,把它改成Blank的时候,就只会影响这一个单元格了。
额外优化小建议
你嵌套的while循环可以换成更Pythonic的for循环,代码会更简洁:
types_of_cells = { "S": Start, "F": Finish, " ": Blank, "-": Wall, "W": Water } cell_list = [] for line in lines: stripped_line = line.strip() row = [] for char in stripped_line: if char in types_of_cells: row.append(types_of_cells[char]()) else: # 处理未知字符的情况,比如默认设为Wall? row.append(Wall()) cell_list.append(row)
这样读起来更清晰,也不容易出错~
内容的提问来源于stack exchange,提问作者redd
相关产品推荐
相关产品推荐

