【问题标题】:Type error when trying to extend a list in Python尝试在 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。两者中的哪一个实际发生?你能提供完整的回溯吗?

标签: python list append typeerror extend


【解决方案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:请重新阅读我的答案 - 我没有存储其中任何一个的值。
    • 我很抱歉;我的手机查看了您答案中的代码,看起来就像您所做的那样(线条看起来是缠绕而不是分开)。
    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 2011-07-23
    • 2011-06-08
    • 2013-09-12
    • 1970-01-01
    • 2019-11-20
    • 2017-12-22
    • 2021-03-11
    相关资源
    最近更新 更多