Python序列类型的extend和+的区别

本文探讨了Python中使用递归函数时遇到的问题,特别是关于序列类型合并的两种方法:extend方法与+运算符的区别。文章通过具体示例说明了两者在效率与返回值上的不同,并给出了一段递归函数的正确实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      刚才写一个Python递归函数,遇到了一个问题,就是序列类型的extend方法和+运算符号的区别。

      listA.extend(listB)  和   listA+listB    的效果都是把两个序列类型的元素相加,形成一个新的序列。    extend()的运算效率比+更高。因此我一直都使用extend方法做序列的合并。

      但是, listA.extend(listB) 的返回结果是None,而不是合并后的序列。listA序列是合并后的序列。

      listA+listB返回的是新的序列。

 

      我在写下面这个递归的函数时因为extend方法的这个特点,得到的总是None对象。   改用+后正常。

 

def getResourceSelfAndParentsDetail(obj):

 

    if(hasattr(obj,"parent")==False or obj.parent==None):

 

        return [obj]

 

 

    else:

        return [obj]+(getResourceSelfAndParentsDetail(obj.parent))

 

测试代码:

class Obj(object):

    def __init__(self,val):

        self.val=val

    def __str__(self):

        return str(self.val)

 

    pass

if __name__ == '__main__':

 

       obj1=Obj(1)

       obj2=Obj(2)

       obj3=Obj(3)

 

       obj2.parent=obj1

       obj3.parent=obj2

       ret=getResourceSelfAndParentsDetail(obj3)

       for obj in ret:

           print str(obj)

显示正确的

3

2

1

 

### Python `extend` `append` 方法的区别 #### 基本概念 在 Python 中,`list.append(x)` 是将单个元素 `x` 添加到列表的末尾[^1]。而 `list.extend(iterable)` 则会将可迭代对象中的每一个元素逐一添加到原列表中[^2]。 --- #### 使用场景对比 ##### 1. **`append` 的行为** 当调用 `append` 方法时,无论传入的是什么类型的对象(如整数、字符串、列表或其他复杂数据结构),它都会作为一个整体被追加到目标列表的最后一位[^3]。 示例代码: ```python original_list = [1, 2, 3] original_list.append(4) # 追加一个单独的数值 print(original_list) # 输出: [1, 2, 3, 4] original_list.append([5, 6]) # 将另一个列表作为单一元素追加进去 print(original_list) # 输出: [1, 2, 3, 4, [5, 6]] ``` 上述例子展示了 `append` 如何对待不同形式的对象。 --- ##### 2. **`extend` 的行为** 相比之下,`extend` 不会简单地把参数当作一个整体加入列表;而是先解包该参数内的每一项再依次附加至原始列表之后[^4]。 如果传递给它的不是一个真正的集合型资料,则会产生错误提示因为无法遍历非序列化实体。 实例演示如下: ```python base_list = ['a', 'b'] additional_items = ('c', 'd') # 可以是一个元组或者其他任何支持迭代协议的东西 base_list.extend(additional_items) print(base_list) # 结果应该是['a','b','c','d'] another_base = ["hello"] word_chars = "world" another_base.extend(word_chars) print(another_base) # 展现为["hello", 'w', 'o', 'r', 'l', 'd'] ``` 特别注意对于像字典这样的复合类型,在采用这两种方式处理的时候会有显著差异: ```python example_dict = {'name':'John Doe'} sample_list_for_append = [] sample_list_for_extend = [] # Append case: sample_list_for_append.append(example_dict.copy()) print(sample_list_for_append) # Extend case: try: sample_list_for_extend.extend(example_dict.keys()) except Exception as e: print(f"Error occurred:{e}") else: print(sample_list_for_extend) finally: pass # 此处省略异常管理细节以便聚焦主题讨论 ``` 在这里可以看到当我们试图扩展一个字典时候,默认情况下只有键会被提取出来并逐条插入新表之中。 --- ### 总结说明 因此可以说两者主要差别在于一个是针对个体项目做累加(`append`) ,另一方则是面向群体成员实施扩充 (`extend`). 明确区分这两者能够帮助开发者更精确有效地构建自己的程序逻辑. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值