尝试在 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】:append
和 extend
对列表的操作不会返回任何内容(仅返回 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”