You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:07:49