前言全局说明
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 这样的结果
解决方法:
使用"深拷贝" 将两个变量创建到两个内存区域
四、正确结果
#!/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