Python 列表 append()函数使用详解-程序员宅基地

技术标签: python  后端  网络安全  Python  开发语言  

「作者主页」:士别三日wyx

1. 基本使用

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

语法

list.append( element )

参数

  • element:任何类型的元素

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

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

输出:

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

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

2. 任意类型元素

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

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

list1 = ['zhangsan', 'lisi', 'wangwu']
list1.append(1)  # 添加整形
print(list1)
list1.append('str')  # 添加字符型
print(list1)

输出:

['zhangsan', 'lisi', 'wangwu', 1]
['zhangsan', 'lisi', 'wangwu', 1, 'str']

实例:添加集合类型(列表,元祖)元素

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)]

3. 列表同步

        使用 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 解决方案

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

  1. 浅拷贝:拷贝这个对象的引用地址
  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]]

列表同步问题解决了

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

  1. append添加的是元素本身,而extend添加的是元素的值
  2. 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

智能推荐

spring基本bean注入方法配置_"<ref bean=\"c1\"/>"-程序员宅基地

文章浏览阅读316次。spring基本bean注入方法配置_""

Lua 入门_lua_setupvalue-程序员宅基地

文章浏览阅读1.4k次。此篇文章所有操作都是基于上一篇安装的docker容器内进行操作案例来自于菜鸟教程首先进入容器安装vimapk add vimLua 变量变量就是给一块内存区域赋予一个值。使得程序可以读取和修改相应内存中内容。变量由字母、数字、下划线组成。必须以字母或下划线开头。Lua 是大小写敏感的。变量分为全局变量和局部变量type variable_listlocal a, b = 1, 10 --局部变量c, d = 2, 20 -- 全局变量如果变量只定义了没有初始化_lua_setupvalue

3.3 ORACLE 的 EMP&DEPT表 建表语句_oracle emp建表语句-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏15次。ORACLE 的 EMP&DEPT表 建表语句-- 创建表与数据CREATE TABLE EMP(EMPNO NUMBER(4) NOT NULL,ENAME VARCHAR2(10),JOB VARCHAR2(9),MGR NUMBER(4),HIREDATE DATE,SAL NUMBER(7, 2),COMM NUMBER(7, 2),DEPTNO NUMBER(..._oracle emp建表语句

使django支持PUT,DELETE的方案_django如何简单快速实现put、delete方法-程序员宅基地

文章浏览阅读9.5k次。第一种方案修改ajax中type方式并设置header,同时对put重新构建数据字典在对views中的方法进行类对象封装时,发现django并不支持像post和get一样将数据封装。 由于网页端无法设置method方法,在用postman和ajax开启pycharm对接口进行debug测试时发现:提交数据后并没有进入代码逻辑。 查阅资料得知,django支持put和delete方法..._django如何简单快速实现put、delete方法

vscode通过跳板机(堡垒机)连接remote服务器_vscode 连接堡垒机-程序员宅基地

文章浏览阅读2.9w次,点赞17次,收藏45次。先吐槽: 搞了一上午!!! 我太难了!!! 最近服务器不够用, 就差动手算深度学习梯度了!!! 向本科朋友借了几台机子跑, 这要是没上过大学, 研究生还不能毕业了呢!!!目录1. 简单任务介绍2. 本机的配置3. 跳板机的配置4.内网服务器的配置5. 怎么样不需要密码访问嘤嘤嘤~~1. 简单的任务介绍:我现在用的电脑叫做A, 然后借了一台服务器叫做C..._vscode 连接堡垒机

【实战】python-docx---每页表格固定显示行数_python docx设置每页行数-程序员宅基地

文章浏览阅读1.1k次。例如100行数据填入word,每页固定展示5行,需要20页_python docx设置每页行数

随便推点

在Android studio中引入butterKnife遇到的坑_butterknife 错误: 元素值必须为常量表达式-程序员宅基地

文章浏览阅读1.2k次。Android studio中引入butterKnife在build.gradle的ependencies中添加implementation 'com.jakewharton:butterknife:8.5.1'annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'接下来在项目中的MainActivity中绑定即可,绑定语句应写在setContentView下面: setContentView(R.layout.activ_butterknife 错误: 元素值必须为常量表达式

Shell编程之case循环、for循环及while循环理论与实例_scl case循环执行-程序员宅基地

文章浏览阅读493次。文章目录前言:一、case多分支语句1.1 case语句的结构1.2 case语句应用示例二、for循环语句2.1 for循环语句结构2.2 for语句应用示例三、while 循环语句3.1 while 语句结构3.2 while 语句应用示例总结:前言:除了我们之前讲述的if条件语句外,作为一种脚本编程语言,Shell同样包含循环、分支等其他程序结构,从而能够轻松完成更加复杂的工作,本篇博客..._scl case循环执行

TCP中的RST标志(Reset)详解_tcp的rst-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏7次。TCP中的RST标志(Reset)详解_a_tu_的专栏-程序员宅基地_rst tcp在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接、四次握手怎样把全双工的连接关闭掉、滑动窗口是怎么传输数据的、TCP的flag标志位里RST在哪些情况下出现。下面我会画一些尽量简化的图来表达清楚上述几点,之后再了解下RST攻击是怎么回事。1、TCP是什么?TCP是在IP网络层之上的传输层协议,用于提供port到port面向连接的可靠的字节流传输。我来用土语解释下上面的几个关键字:por_tcp的rst

日常问题集锦_el-input 居中-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏5次。【①】运行项目时出现的端口被占用问题:【②】JS中获取当前时间:【③】一些常用的校验规则:【④】vue 表格中数据默认全部选中:【⑤】vue 获取表格中选中行的数据:【⑥】vue 强制更新数据:【⑦】vue 想要el-input框内文字居中显示:【⑧】vue 清除表单内的内容或者清除表单验证:【⑨】vue 表格分页的两种格式:【⑩】vue 中防止按钮重复点击提交的方法:_el-input 居中

Android11及以上 文件读写权限申请_android 11 write_external_storage-程序员宅基地

文章浏览阅读2.1w次,点赞9次,收藏50次。Android11及以上 文件读写权限申请_android 11 write_external_storage

yii2 在线教育系统,开办托管班需要什么手续?如何经营托管班?-程序员宅基地

文章浏览阅读330次,点赞8次,收藏6次。托管班店铺的装修风格,一定要结合学生喜欢的设计风格,颜色搭配一定要看起来舒适,让学生一进来就有学习的范围,不由自主就想学习的动力,所以装修的风格,是要符合学生学习的环境氛围,让学生一进来想呆着不想走,所以设计方面,一定一定多参考同行的装修风格。想要运营好一家托管班,那么需要有一个正规化的管理流程,那么就要为校区制定各种规章制度,按照规章制度来走,避免后期因为没有任何提示,导致出现一系列的问题,所以要出针对教师,学生,家长的不同规章制度。保护孩子的安全,预防托管机构火灾事故的发生,是托管班一项重要指标。

推荐文章

热门文章

相关标签