python中list 的 += 和 append 等价么?

如下代码中有两处列表添加 Interval 对象的地方,其中一处用的append,一处用的+=
其中用append的地方如果改为 += 则报错,很奇怪啊,感觉两处应该都是一致的,有没有哪位大拿可以解释下呢?(当然此处不考虑性能,只考虑正确性)
TypeError: 'Interval' object is not iterable
注:有问题的地方是倒数第六行到倒数第三行

# 这一行是ok的
intervals.append(Interval(l,r))
# 下面这一行会报错 TypeError: 'Interval' object is not iterable
# intervals += (Interval(l,r))

可以用+=的地方是

out += i,
# -*- coding: utf-8 -*-
"""
Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].
"""

# Definition for an interval.
class Interval(object):
    def __init__(self, s=0, e=0):
        self.start = s
        self.end = e

def merge(intervals):
    """
    :type intervals: List[Interval]
    :rtype: List[Interval]
    """
    out = []
    for i in sorted(intervals, key=lambda i: i.start):
        # 列表最后一个 下标为 -1
        if out and i.start <= out[-1].end:
            out[-1].end = max(out[-1].end, i.end)
        else:
            # 列表的 += 等于 append ??
            out += i,
    return out

def print_intervals(intervals):
    res = []
    for i in intervals:
        res.append('['+str(i.start)+','+str(i.end)+']')
    print("".join(res))

if __name__ == "__main__":
    given = [[1,3],[8,10],[2,6],[15,18]]
    intervals = []
    # 自动解包
    for l, r in given:
        # 这一行是ok的
        intervals.append(Interval(l,r))
        # 下面这一行会报错 TypeError: 'Interval' object is not iterable
        # intervals += (Interval(l,r))
    print_intervals(intervals)
    print_intervals(merge(intervals))
阅读 13.6k
2 个回答

不等价, 因为对于list+=,它要求右边对象是iterable的,也就是说,能够用于迭代的, 例如元组,列表甚至是字典这些, 而append则没这个要求, 因为它直接将右边的对象,当成一个整体, 追加到列表末尾! 可以通过下面的例子帮助理解

# += 演示
>>> a = []
>>> a+= (1,2)
>>> a
[1, 2]
>>> a+= [1,2]
>>> a
[1, 2, 1, 2]
>>> a+= {'a':123, 'b':333}
>>> a
[1, 2, 1, 2, 'a', 'b']

# append 演示
>>> a.append({'a':123, 'b': 333})
>>> a
[1, 2, 1, 2, 'a', 'b', {'a': 123, 'b': 333}]
>>> a.append((1,2))
>>> a
[1, 2, 1, 2, 'a', 'b', {'a': 123, 'b': 333}, (1, 2)]

+=extend的参数应该是iterable。你的代码里i,是个元组(元组是iterable)(Interval(l,r))不是元组,改到(Interval(l,r),)或者Interval(l,r),就行。

Python中打元组的时候,是必须的,()不是:

3, #元组
(3,) #元组
(3) #int

你最好写:

intervals = [Interval(l, r) for l, r in given]

或者

intervals = [Interval(*c) for c in given]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题