copy函数+不/可变对象,python实现list每个元素依次左移

2024-04-26 01:08

本文主要是介绍copy函数+不/可变对象,python实现list每个元素依次左移,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Python实现list的所有元素左移一个位置,且将所有结果保存成一个list
例如:[1,2,3,4,5]
输出:[[1,2,3,4,5], [2,3,4,5,1], [3,4,5,1,2], [4,5,1,2,3], [5,1,2,3,4]]

天真烂漫

lt = [1, 2, 3, 4, 5]
end=[]
l=len(lt)
for i in range(l):lt.append(lt.pop(0))end.append(lt)print(end)
>>>[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

看到结果的我是有点蒙逼的???为何会这样,end每一步append的元素,最后为何变成一样的了?立刻意识到这个问题不简单,半路出家的我知道我该去看看list的底层实现了。
但在这之前,我先看了python的可变与不可变对象。

python的可变与不可变对象

不可变对象:对象存放在地址中的值不会被改变,当想要修改对象时,会新创建一个地址来存放改变后的值,而原来的对象并不发生改变;而且当两个对象的值一样的时候,只有一个地址存放,两个对象都指向这个地址。

可变对象:对象存放在地址中的值会原地改变

int str float tuple 属于不可变对象 其中tuple更与众不同

dict set list 属于可变对象


那么也就是说,list作为可变对象,end每次append的时候,是原地改变的,

lt = [1, 2, 3, 4, 5]
end=[]
for i in range(len(lt)):print(id(lt))lt.append(lt.pop(0))print(id(lt))end.append(lt)print(end)
>>>
2897136022472
2897136022472
2897136022472
2897136022472
2897136022472
2897136022472
2897136022472
2897136022472
2897136022472
2897136022472
[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]

从id的结果可以看出来,确实列表的id一直没有变。再debug过程中观察
在这里插入图片描述
在这里插入图片描述
当再一次为end加入元素时,会在原有的列表基础上进行修改,只不过这次连接的是两个lt,而lt对象指向的内存地址中的值是[3, ,4, 5, 1, 2]所以end就会改变。这时可以用copy函数解决这个问题,这里说明一下copy函数。


python传递变量值的三种形式:赋值,浅拷贝,深拷贝

  • 基本数据类型
    在Python中基本数据类型(整型、字符串、布尔及None)的赋值、深浅拷贝没有任何意义,都是指向同一块内存地址,也不存在层次问题。
import copy
n1 = 'abc'
n2 = n1
n3 = copy.copy(n1)
n4 = copy.deepcopy(n1)
print(id(n1))    #输出140350336680040
print(id(n2))    #输出140350336680040
print(id(n3))    #输出140350336680040
print(id(n4))    #输出140350336680040
  • 列表、元组、字典等非基本数据类型对象的赋值、深浅拷贝的区别

假设字典n1 = {“k1”: “abc”, “k2”: 123, “k3”: [“abc”, 123]}

赋值是将变量的内存赋给另一个变量,让另一个变量指向那个内存地址
在这里插入图片描述

  1. 浅拷贝
    在内存中将第一层额外开辟空间进行存放
    在这里插入图片描述
n1 = {"k1": "abc", "k2": 123, "k3": ["abc", 123]}   
print(id(n1))    #140350328984328
n3 = copy.copy(n1)
print(id(n3))    #140350328986504可以看n3的内存地址已经和n1不同了print(id(n1['k3']))    #140350328603976
print(id(n3['k3']))    #140350328603976 字典里的列表还是指向同一个列表

2.深拷贝

深拷贝就是在内存中将数据重新创建一份,不仅仅是第一层,第二层、第三层…都会重新创建
在这里插入图片描述

n1 = {"k1": "abc", "k2": 123, "k3": ["abc", 123]}
print(id(n1))    #140350328984328
n3 = copy.deepcopy(n1)print(id(n1['k3']))    #140350328603976
print(id(n3['k3']))    #140350328604296 
#可以看到第二层的列表也拷贝了一份,内存地址已经完全不一样

言归正传,以上的问题既可以结局了

lt = [1, 2, 3, 4, 5]
end=[]
for i in range(len(lt)):lt.append(lt.pop(0))end.append(lt.copy())print(end)
>>>[[2, 3, 4, 5, 1], [3, 4, 5, 1, 2], [4, 5, 1, 2, 3], [5, 1, 2, 3, 4], [1, 2, 3, 4, 5]]

perfect!

这篇关于copy函数+不/可变对象,python实现list每个元素依次左移的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/936299

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法