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

错误的输出结果:
image


三、问题思考

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

正确的结果:
image


五、扩展

浅拷贝: 浅拷贝会创建一个新对象副本,然后用原始对象中的子对象的引用来填充新对象,而不会为子对象创建一块新内存。

浅拷贝的实现:

import copy
b = copy.copy(a) # 浅拷贝

深拷贝: 深拷贝创建一个新对象副本,并且递归地为原始对象中所有的子对象创建副本。新对象和原始对象完全独立。

深拷贝的实现:

import copy
b = copy.deepcopy(a) # 深拷贝


免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。




参考、来源:
https://blog.csdn.net/qq_44743171/article/details/133045067



posted @   悟透  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示