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

相关文章

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果