"TypeError: 'NoneType' object is not subscriptable" for a dictionary in my game?

"TypeError: 'NoneType' object is not subscriptable" for a dictionary in my game?

我现在正在学习 Python 课程,我终于解决了我们正在开发的这款冒险游戏的所有语法错误。 class 的项目蓝图中提供的引擎除外,我编写了所有代码。我想既然我解决了语法问题,游戏就可以正常运行了,但是当我尝试 运行 游戏时,我得到的错误是 "TypeError: 'NoneType' object is not subscriptable"。我们不应该弄乱游戏的引擎,因为我们应该作为 class 的一部分解决它,但引擎似乎是导致问题的原因。我只是不理解与我的问题相关的错误代码。

整个项目在这里:https://github.com/bsweat/AppalachianTrail,但这是导致错误的特定部分。

def main():
    print(render_introduction())
    world = create_world()
    while world['status'] == 'playing':
        print(render(world))  #line 316
        options = get_options(world)
        command = choose(options)
        print(update(world, command))
    print(render_ending(world))
if __name__ == '__main__':
    main() #line323

我得到的完整错误是

Traceback (most recent call last):
    File "C:\Users\Appalachian Trail Legit.py", line 323, in <module> main()
    File "C:\Users\Appalachian Trail Legit.py", line 316, in main while world['status'] == 'playing':
TypeError: 'NoneType' object is not subscriptable

我假设整个游戏都坏了,但老实说我什至不知道从哪里开始修复它。我不太确定哪个变量变成了 None,我认为错误代码是说 world['status']None,但是 ['status'] 设置为 'playing' 游戏一开始。也许一些训练有素的眼睛可以看到这个问题?

编辑:非常感谢@aaron 指出这是缩进错误。避免 TypeError: 'NoneType' object is not subscriptable 的最佳方法是测试测试测试!

错误提示,正在对不可订阅的数据类型进行订阅。订阅意味着通过索引或值引用数据结构中的值。对于列表、元组等订阅是使用索引完成的,对于字典,它是通过使用键值完成的。

这是一个字典订阅的例子

sample_dict={100:'a',200:'b'} 是字典。 为了从此字典中获取值,您使用键值进行引用。因此,sample_dict[100] 产生 'a' 和类似的输出。

程序出错,world['status']的订阅提取失败。这是因为变量 world 不是预期的 dictionary 而是 None 类型,它只是表示变量内部没有任何内容。

为了解决这个问题,请找出 world 变量是如何分配的。从程序中我看到它来自语句 world = create_world()

中的 create_world() 函数

检查create_World()函数并解决错误。

调试愉快。 :)

无论您在 create_world() 函数末尾 return 什么,都必须是字典。 我 运行 经常遇到这个问题,在你的 return 字典中的 create_map() 函数中你有

return {
        'map' : create_map(),
        'player' : create_player(),
        'status' : 'playing'
     }

根据我的经验,这总是令人讨厌。如果您打算再次调用 returned 值,您要做的是在将它们传递到那里之前分配这些函数。因此,对于您代码中看起来像这样的所有内容,您可能希望使其更像。

map = create_map()
player = create_player()
return {
        'map' : map,
        'player' : player,
        'status' : 'playing'
     }

请注意,这些是变量名,因此没有引号。这样做,你应该没问题。 希望对你有帮助。

您的嵌套函数 create_map 缺少缩进,这会提前结束您的 create_world 函数并使其隐式 return None

def create_world():
    ...

    def create_player():
        return ...

def create_map():
    return ...

    return {
        'map' : create_map(),
        'player' : create_player(),
        'status' : 'playing'
     }

应该是:

def create_world():
    ...

    def create_player():
        return ...

    def create_map():
        return ...

    return {
        'map' : create_map(),
        'player' : create_player(),
        'status' : 'playing'
    }