尝试在 Python 中扩展列表时出现类型错误

Posted

技术标签:

【中文标题】尝试在 Python 中扩展列表时出现类型错误【英文标题】:Type error when trying to extend a list in Python 【发布时间】:2015-10-22 10:00:22 【问题描述】:

我需要明白为什么:

years = range(2010,2016)
years.append(0)

是可能的,返回:

[2010,2011,2012,2013,2014,2015,0]

years = range(2010,2016).append(0)

years = [0].extend(range(2010,2016))

不工作?

我了解到这是我收到的消息中的类型错误。但我想在这背后有更多的解释。

【问题讨论】:

你的最后一行基本上是这样的:设置一个匿名列表[0],然后extend()该列表与range()的结果,存储extend()的结果(即@987654329 @) 在years 中,然后扔掉该列表,因为它从未绑定到名称。 你应该真正显示你得到的实际错误。 both 示例生成 TypeError(使用 Python 3),或者两者都不生成(Python 2),但您最终将 years 设置为 None。两者中的哪一个实际发生?你能提供完整的回溯吗? 【参考方案1】:

您正在存储list.append()list.extend() 方法的结果;两者都更改列表就地并返回None。他们确实不会再次返回列表对象。

不要存储None 结果;存储range() 结果,然后 扩展或追加。或者,使用串联:

years = range(2010, 2016) + [0]
years = [0] + range(2010, 2016)

请注意,我假设您使用的是 Python 2(否则您的第一个示例将无法正常工作)。在 Python 3 中,range() 不会生成列表;您必须使用 list() 函数将其转换为 1:

years = list(range(2010, 2016)) + [0]
years = [0] + list(range(2010, 2016))

【讨论】:

非常感谢您的解释。【参考方案2】:

appendextend 对列表的操作不会返回任何内容(仅返回 None)。这就是为什么years 不是您期望的列表。

【讨论】:

【参考方案3】:

在 Python 3 中 range 返回范围类的实例,而不是列表。如果你想操作range 的结果,你需要一个列表,所以:

years = list(range(2010,2016)) 
years.append(2016)

最后,(与上面的追加类似)extend 对您调用它的列表进行操作,而不是返回新列表,所以:

years = list(range(2010,2016))
years.extend( list(range(2016,2020)))

*虽然 Python 2 的 range 函数确实返回一个列表,但上面的代码在 Python 2 中仍然可以正常工作*

希望这会有所帮助!

【讨论】:

@MartijnPieters:我已经调整了我的解释以反映您的上述观点 - 请重新评估,因为我认为您已经阅读了我的答案的旧版本 - 我没有建议 years = list(range(2010, 2016)).append(0) 是正确的. @MartijnPieters:请重新阅读我的答案 - 我没有存储其中任何一个的值。 我很抱歉;我的手机查看了您答案中的代码,看起来就像您所做的那样(线条看起来是缠绕而不是分开)。

以上是关于尝试在 Python 中扩展列表时出现类型错误的主要内容,如果未能解决你的问题,请参考以下文章

Unhashable 类型:尝试在 Django 中使用 post_save 动态添加 m2m 关系时出现“列表”错误

尝试从一系列字典中检索键时出现“类型错误:列表索引必须是整数或切片,而不是 str”

尝试从列表播放时出现 MediaPlayer 错误

安装 cocoapods 时出现 gem 本机扩展错误

无 在 Python 中运行 streamlit 时出现类型错误

访问网页中的列表框时出现 NoSuchElementException