首页 > 编程语言 >Python list列表pop弹出内容del移除内容结果不对错误

Python list列表pop弹出内容del移除内容结果不对错误

时间:2024-03-06 16:45:01浏览次数:31  
标签:Python list pop 列表 num 移除 拷贝 copy

前言全局说明

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 这样的结果

解决方法:

使用"深拷贝" 将两个变量创建到两个内存区域


四、正确结果

#!/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



标签:Python,list,pop,列表,num,移除,拷贝,copy
From: https://www.cnblogs.com/wutou/p/18056884

相关文章

  • Python函数每日一讲 - hex()
    引言在Python编程中,处理十六进制数据是一项常见的任务。hex()函数就是Python中用于将整数转换为十六进制字符串的函数。本文将深入介绍hex()函数的使用方法,并通过实例演示其在实际应用中的作用,帮助大家更好地掌握这一工具。语句概览hex()函数是Python内置函数之一,用于将整数转......
  • Collection接口中的List接口
    List1:Collection(接口):-List元素有序且允许重复,集合具有索引的概念(接口)-ArrayList(具体子类)-Set元素无序且唯一,集合没有索引packagecom.shujia.day12;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publiccla......
  • Collection接口中的List接口中的Vector具体类
    VectorCollection(接口)-List(接口)-ArrayList(实现类)底层数据结构是数组,查询快,增删慢,线程是不安全的,效率高。-Vector(实现类)底层数据结构是数组,查询快,增删慢,线程是安全的,效率低。(即使这个是线程安全的,我们今后也不用,后面我们会将不安全的ArrayLis......
  • Python-动态类型
    动态类型在Python中,类型是在运行时自动确定的,而不是通过代码声明,即Python没有必要事先声明变量。1.变量、对象和引用变量创建:一个变量在代码第一次给它赋值时就创建了它,之后的赋值将会改变已创建的变量的值;Python在代码运行之前会先检测变量名,是最初的赋值操作在创建变量。变......
  • Collection接口中的ArrryList具体的类
    Collecction接口目前为止学习的容器有1.数组:长度一旦确定就不能更改,对于同一个数组中,既可以是存放基本数据类型元素的数组,也可以是存放引用数据类型数组2.StringBuffer:无论存放什么类型的元素,一旦进入到StringBuffer,都是以字符类型的形式存储,长度可以改变3.集合:结合了数组和长......
  • 使用python编程实现多个csv文件数据的合并和输出
    具体代码importpandasaspdimportosdf01=pd.read_csv("D:\\12140\\Desktops\\111\\t11.csv",encoding='utf-8',dtype='str')df02=pd.read_csv("D:\\12140\\Desktops\\111\\t12.csv",encoding='utf-......
  • /usr/bin/install: 无法更改“/usr/local/python397/bin“ 的权限: 没有那个文件或目
    /usr/bin/install:无法更改“/usr/local/python397/bin“的权限:没有那个文件或目录dragoo1于2021-09-2116:39:21发布阅读量3.7k收藏9点赞数4分类专栏:python文章标签:pythoninstall没有那个文件或目录版权python专栏收录该内容3篇文章0订阅订阅专栏编译python......
  • Python实现五子棋人机对战的二次开发
    Python实现人机对战的二次开发    在网上找到了一个使用python实现五子棋游戏,其中通过加入一个简单的AI算法实现了人机对战的功能,我觉得这个人机对战还是蛮有意思的,下面我分析一下五子棋游戏的规则、棋盘表示方法、AI算法的实现原理以及代码实现过程。最后二次开发时引入新的......
  • python-合并大型Excel
    使用openpyxl库实在是太慢,使用openpyxl的只读模式又需要excel的准确尺寸信息,但是每个excel的尺寸都不一样。我使用zipfile解压excel文件,直接读取xml文件进行合并:importosfromopenpyxlimportload_workbookfromopenpyxlimportWorkbookimportzipfileimportretotal_......
  • List集合
    ListList集合的特点有序、可重复、有索引。Listremove重载方法的细节List的remove方法有两个案例一publicstaticvoidmain(String[]args){List<Integer>integers=newArrayList<Integer>();integers.add(1);integers.add(2);intege......