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

查看:96
本文介绍了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))

解决方案

不等价, 因为对于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)]

这篇关于python中list 的 += 和 append 等价么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆