"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'
}
我现在正在学习 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'
}