Python 列表 append()函数使用详解

一、基本使用

append() 函数可以向列表末尾添加元素

语法

list.append( element )

参数

  • element:任何类型的元素

实例:向列表末尾添加一个元素

name_list = ['zhangsan', 'lisi', 'wangwu']
name_list.append('zhaoliu')
print(name_list)

输出:

['zhangsan', 'lisi', 'wangwu', 'zhaoliu']

需要注意的是, append() 函数添加的元素在列表的「末尾」而不是任意位置

二. 任意类型元素

append() 函数可以向列表末尾添加「任意类型」的元素

实例:添加普通类型(数值、字符串)元素

list1 = ['zhangsan']
list1.append([1,2,3])  # 添加列表
print(list1)
list1.append((4,5,6))  # 添加元祖
print(list1)
['zhangsan', [1, 2, 3]]
['zhangsan', [1, 2, 3], (4, 5, 6)]

三. 列表同步

    使用 append() 函数添加列表时,是添加列表的「引用地址」而不是添加列表内容,当被添加的列表发生变化时,添加后的列表也会同步发生变化。
    list1 = ['zhangsan']
a = [1,2,3]
list1.append(a)  # 列表list1添加列表a
print(list1)
a.append(4)  # 列表a发生变化
list1.append(a)
print(list1)  # 列表list1也会同步变化
['zhangsan', [1, 2, 3]]
['zhangsan', [1, 2, 3, 4], [1, 2, 3, 4]]

3.1 原理剖析

    从输出结果可以发现,当添加的列表发生变化时,先前添加的内容也发生了改变,这会使程序出现意料之外的问题,我们使用 id() 函数验证一下
 list1 = ['zhangsan']
a = [1,2,3]
list1.append(a)
print(a, id(a))  # 列表a的引用地址
print(list1[1], id(list1[1]))  # 添加到列表后的引用地址

输出:

[1, 2, 3] 2992145244608
[1, 2, 3] 2992145244608

3.2 解决方案

从输出结果可以看出,问题的原因就在引用地址上面。这里补充两个概念

  • 浅拷贝:拷贝这个对象的引用地址
  • 深拷贝:拷贝对象的内容

使用 copy.deepcopy() 函数深拷贝列表的内容而不是列表的引用地址

list1 = ['zhangsan']
a = [1,2,3]
list1.append(copy.deepcopy(a))
print(a, id(a))  # 列表a的引用地址
print(list1[1], id(list1[1]))  # 添加到列表后的引用地址
[1, 2, 3] 1963457096704
[1, 2, 3] 1963458936640

由输出结果可以确定,添加后的列表不再引用源列表的地址
使用「深拷贝」添加列表的内容而不是引用地址,从而解决列表同步的问题

list1 = ['zhangsan']
a = [1,2,3]
list1.append(copy.deepcopy(a))  # 深拷贝列表a
print(list1)
a.append(4)  # 列表a发生变化
list1.append(copy.deepcopy(a))  # 深拷贝列表a
print(list1)  # 列表list1不再同步变化
['zhangsan', [1, 2, 3]]
['zhangsan', [1, 2, 3], [1, 2, 3, 4]]

四. append()与extend()的区别

append添加的是元素本身,而extend添加的是元素的值
append可以添加所有类型元素,而extend只能添加序列
比如,添加列表时,append会添加整个列表,而extend只会添加列表中的值

list1 = ['zhangsan', 'lisi', 'wangwu']
list2 = ['zhangsan', 'lisi', 'wangwu']
list1.append([1,2,3])
print('append添加整个列表:', list1)
list2.extend([1,2,3])
print('extend添加列表的值:', list2)
append添加整个列表: ['zhangsan', 'lisi', 'wangwu', [1, 2, 3]]
extend添加列表的值: ['zhangsan', 'lisi', 'wangwu', 1, 2, 3]

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wangyuxiang946/article/details/122142534

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码定义了一个类的 `toString()` 方法,用于将对象转换为字符串表示。 - `@Override`:这是一个注解,表示该方法是重写父类或接口中同名方法的。 - `public String toString() {`:定义了一个公共的、返回字符串类型的 `toString()` 方法,该方法没有参数。 - `StringBuilder sb = new StringBuilder();`:创建一个字符串构建器对象 `sb`,用于构建最终的字符串。 - `sb.append(getClass().getSimpleName());`:将该对象所属类的简单名称(不包含包名)添加到构建器中。 - `sb.append(" [");`:将一个括号和一个空格添加到构建器中。 - `sb.append("Hash = ").append(hashCode());`:将对象的哈希码添加到构建器中。 - `sb.append(", id=").append(id);`:将对象的 `id` 属性添加到构建器中。 - `sb.append(", userName=").append(userName);`:将对象的 `userName` 属性添加到构建器中。 - `sb.append(", password=").append(password);`:将对象的 `password` 属性添加到构建器中。 - `sb.append(", roleId=").append(roleId);`:将对象的 `roleId` 属性添加到构建器中。 - `sb.append(", headimg=").append(headimg);`:将对象的 `headimg` 属性添加到构建器中。 - `sb.append(", phone=").append(phone);`:将对象的 `phone` 属性添加到构建器中。 - `sb.append(", sex=").append(sex);`:将对象的 `sex` 属性添加到构建器中。 - `sb.append(", buildingNo=").append(buildingNo);`:将对象的 `buildingNo` 属性添加到构建器中。 - `sb.append(", createTime=").append(createTime);`:将对象的 `createTime` 属性添加到构建器中。 - `sb.append(", isLock=").append(isLock);`:将对象的 `isLock` 属性添加到构建器中。 - `sb.append(", serialVersionUID=").append(serialVersionUID);`:将对象的 `serialVersionUID` 属性添加到构建器中。 - `sb.append("]");`:将一个右括号添加到构建器中。 - `return sb.toString();`:将构建器中的内容转换为字符串并返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值