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