Python list列表pop弹出内容del移除内容结果不对错误
前言全局说明
Python list列表pop弹出内容del移除内容结果不对
一、功能需求
一个list列表,内容是1-9,用for循环打印,打印过的值,从列表中删除
二、输出结果不对,代码有问题
文件名: test.py
#!/usr/bin/env python3 #coding: UTF-8 # -*- coding: UTF-8 -*- lists_1= ['a', 'b'] num_3 = ['1', '2','3','4','5','6','7','8','9'] for t in lists_1: tmp = num_3 for f in tmp: ## 把输出过的内容,从列表中移除 print("f:",f) num_3.pop(0) if f == '5': break print(f"第 {t} 次输出完成.\n")
错误的输出结果:
三、问题思考
1.确认是列表,可以用 pop 和 del,语法没错
2.代码也没有多写
3.也不是数组
突然灵光一现
想起之前看的书里提到过变量内存的 "深拷贝" 和 "浅拷贝",
赶紧用 id(num_3) 和 id(tmp) 的内存ID 打印了一下,果然是一样的。
经过分析:
在 for 时,又 pop 了一次,虽然操作的是不同变量,但实际上是同一块内存
就相当于 pop 了两次。那肯定就输出 1、3、5 这样的结果
解决方法:
使用"深拷贝" 将两个变量创建到两个内存区域,互不影响。
四、正确结果
文件名: test.py
#!/usr/bin/env python3 #coding: UTF-8 # -*- coding: UTF-8 -*- lists_1= ['a', 'b'] num_3 = ['1', '2','3','4','5','6','7','8','9'] import copy for t in lists_1: tmp = copy.deepcopy(num_3) for f in tmp: ## 把输出过的内容,从列表中移除 print("f:",f) num_3.pop(0) if f == '5': break print(f"第 {t} 次输出完成.\n")
正确的结果:
五、扩展
浅拷贝: 浅拷贝会创建一个新对象副本,然后用原始对象中的子对象的引用来填充新对象,而不会为子对象创建一块新内存。
浅拷贝的实现:
import copy b = copy.copy(a) # 浅拷贝
深拷贝: 深拷贝创建一个新对象副本,并且递归地为原始对象中所有的子对象创建副本。新对象和原始对象完全独立。
深拷贝的实现:
import copy b = copy.deepcopy(a) # 深拷贝
免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。
参考、来源:
https://blog.csdn.net/qq_44743171/article/details/133045067
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)