类型为“NoneType”的对象没有长度('len()')错误。

21

我在这段代码中发现了奇怪的行为:

images = dict(cover=[],second_row=[],additional_rows=[])

for pic in pictures:
    if len(images['cover']) == 0:
        images['cover'] = pic.path_thumb_l
    elif len(images['second_row']) < 3:
        images['second_row'].append(pic.path_thumb_m)
    else:
        images['additional_rows'].append(pic.path_thumb_s)
我的web2py应用程序给了我这个错误:
if len(images['cover']) == 0:
TypeError: object of type 'NoneType' has no len()
我不知道这个有什么问题。也许是某个范围的问题吗?

1
您正在请求包含“None”的变量的长度。 None是一种特殊值(类型为NoneType),它没有长度。在检查某个东西的长度之前,请先确保它不具有“None”值。 - Eric Leschinski
4个回答

17

你将新的内容分配给 images['cover']

images['cover'] = pic.path_thumb_l

您的代码中有某些时候 pic.path_thumb_l 的值为 None

您可能想要进行追加操作:

images['cover'].append(pic.path_thumb_l)

16

你的问题是

if len(images['cover']) == 0:

检查images['cover']的值的长度,但你的本意是检查它是否有值。

请改为以下代码:

if not images['cover']:


实际上是由于将一些“None”分配给了images['cover'](正如Martjin所指出的)。但还是谢谢! - dmmd
在你的帖子中,你说这一行 if len(images['cover']) == 0: 给了你错误... - Inbar Rose
2
无论如何,您应该将代码更改为if not images['cover']:,因为如果长度不为0,则已经具有值,这样更符合Pythonic的风格 :) - Inbar Rose
是的。在for循环的第二次迭代中, images ['cover']的类型为“无”,因为第一次迭代将某些“无”值分配给它。 - dmmd
哦,是的,没错。我会这样做的!谢谢 :) - dmmd

4

在同样的情况下,我们也可以看到类型,如果您想要避免某些内容,可以这样做。

if myArray is None:
    #Do something when array has no len()
else:
    #Do something when array has elements and has len()

在我的情况下,我正在查找数组中的某些内容,但仅当它有内容时,当它没有内容时,类型为“None”,我需要创建它。希望这对某些人有用。

2
第一次分配:images['cover'] = pic.path_thumb_l,它用pic.path_thumb_l的值替换了最初存储在images['cover']中的空列表的值,该值为None
也许你在这行代码中应该使用images['cover'].append(pic.path_thumb_l)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接