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 @ 2024-03-06 16:42  悟透  阅读(33)  评论(0)    收藏  举报