【python基础】python可变序列与不可变序列

news2024/11/17 0:33:20

文章目录

  • 前言
  • 一、序列类型定义
  • 二、对序列类型的切片操作
  • 三、使用 + 与 * 对序进行操作
  • 四、增量赋值 += 和 *=


前言

本文主要讲可变序列与不可变序列一些简单的应用。

一、序列类型定义

按序列能否被修改分为:可变序列与不可变序列。
可变序列:可以进行增、删、改等操作序列。比如:比如列表、集合等。
不可变序列:不可以进行增、删、改等操作序列。比如:元组、字符串等。

  • 可变序列

举例一:列表

list1=[x for x in range(8)]
print('原列表:',id(list1))

list1.append('hello')
print('增加变量后的列表:',id(list1))

输出:

原列表: 1554734032320
增加变量后的列表: 1554734032320

举例二:集合

set1={1,2,3,4,5}
print("原集合:",id(set1))

set1.add('a')
print("增加元素后的集合:",id(set1))

输出:

原集合: 1554733828128
增加元素后的集合: 1554733828128
  • 不可变序列

举例三:元组

tuple1=(1,2,3,4)
print("原元组:",id(tuple1))

tuple1*=3
print("复制后的元组:",id(tuple1))

输出:

原元组: 1554733957184
复制后的元组: 1554723851136

举例四:字符串

str1='hello'
print("原字符串:",id(str1))

str1*=3
print("替换修改后的字符串:",id(str1))

输出:

原字符串: 1554730216624
替换修改后的字符串: 1554733243696

结论:不可变序列在内存中是不会改变的,如果对不可变序列做出改变,会将该序列存储在新的地址空间中,而原来的序列因为垃圾回收机制,会被回收;可变序列发生改变时,是不会改变地址的,而是改变内存中的值,或者扩展内存空间。


二、对序列类型的切片操作

举例:a[i:j:k]取值

s="hello world"

s[::3] #间隔三个字符取值
#输出:
#'hlwl'

s[::-1] #倒序
#输出:
#'dlrow olleh'

s[:5:2]
#输出:
#'hlo'

切片基础理解可以参考:https://blog.csdn.net/sodaloveer/article/details/134197327

举例二:切片对象slice(a,b,c)

seq(start:stop:step)求解时,解释器用seq.getitem(slice(start,end,step))。

s="hello world"

first=slice(0,9) #先创建一个slice对象
last=slice(9,None)

s[first]
#输出:
#'hello wor'

s[last]
#输出:
#'ld'

举例三:多维切片

[ ] 内逗号隔开传入多个切片对象,从而实现多维切片,广泛用于numpy中,list不支持这种操作。

import numpy as np 
a=np.array(range(24))
a=a.reshape((2,3,4))
a

#输出:
#array([[[ 0,  1,  2,  3],
#        [ 4,  5,  6,  7],
#        [ 8,  9, 10, 11]],
#
#       [[12, 13, 14, 15],
#        [16, 17, 18, 19],
#        [20, 21, 22, 23]]])

a[1,2,3] #第2个数组的第三行第四列。
#输出:
#23

a[1,2,1:3]  #第2个数组的第3行第二、四列。
#输出:
#array([21, 22])

a[1,...] #第2个数组
#输出:
#array([[12, 13, 14, 15],
#       [16, 17, 18, 19],
#       [20, 21, 22, 23]])

举例四:切片赋值

  • 切片长度和赋值的数组长度可以不相等
list1=[x for x in range(10)]
list1
#输出:
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

list1[2:5]=[20,30]
list1
#输出:
#[0, 1, 20, 30, 5, 6, 7, 8, 9]

list1[2:4]=[1,1,1,1,1,1,1,1]
list1
#输出:
#[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 6, 7, 8, 9]
  • 间隔切片时必须要相等
list1[::2]=[666,777]
list1

在这里插入图片描述

list1[::2]=[111,222,333,444,666,777,888,999]
list1
#输出:
#[111, 1, 222, 1, 333, 1, 444, 1, 666, 1, 777, 6, 888, 8, 999]

注意: 传入值的形式一定要用[]。

三、使用 + 与 * 对序进行操作

使用 + 与 * 对序进行操作时,python并不修改原有的操作对象,而是构建一个全新序列。

list1=[x for x in range(5)]
list2=[x for x in range(5,10)]

list1+list2
#输出:
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

list1*2
#输出:
#[0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

print('原有的列表并不改变:',list1)
#输出:
#[0, 1, 2, 3, 4]

注意: 对于列表中的元素为引用时,慎用+和*。

list1=[[1,2,3]]

list2=list1*3
list2
#输出:
#[[1, 2, 3], [1, 2, 3], [1, 2, 3]]

list2[0][0]='hello'
#输出:
#[['hello', 2, 3], ['hello', 2, 3], ['hello', 2, 3]]

结论:由上可见,list1是一个只有一个元素的列表,这个元素是一个指向列表[1,2,3]的引用。list2=list1*3操作,则建立三个这样的引用,但作为list2的元素,三个元素都是指向同一个列表对象,所以我们使用第一个元素(list2[0][0]=‘hello’)去修改指向的列表的值时,list2列表中每一个引用的第一个元素都被改变了。
如果只修改引用是没有问题的,如下例所示:

list2[0]="world"
#输出:
#['world', ['hello', 2, 3], ['hello', 2, 3]]

结论:由上可见,此时我们修改了list2的第一个元素,把其重新指向了一个新建的字符串对象。而原来指向的列表没有发生改动,所以后两个元素此时不会发生变化。


四、增量赋值 += 和 *=

就地乘法: *= ,背后是__imul__特殊方法。
就地加法: += ,背后是__iadd__特殊方法,和a.extend(b)一样的效果。若a未实现该特殊方法,Python将退一步调用__add__方法,得到一个求和对象,然后赋值给a。

  • 对于支持就地加法或乘法的序列类型(可变类型),使用+=或*=时,Python不会新建一个对象。如下例所示,a的地址并未发生变化。
a=[x for x in range(5)]
b=[y for y in range(5,10)]

print('原序列:',a,'\n','原序列地址:',id(a))
#输出:
#原序列: [0, 1, 2, 3, 4] 
#原序列地址: 1554755401920

a+=b
print('就地加法后的序列:',a,'\n','就地加法后的序列地址:',id(a))
#输出:
#就地加法后的序列: [0, 1, 2, 3, 4] 
#就地加法后的序列地址: 1554755401920
  • 对于不支持就地加法或乘法的序列类型(不可变类型),使用+=或*=时,Python会新建一个对象。如下例所示,tuple1的地址发生变化。
tuple1=(1,2,3)
print('原序列:',tuple1,'\n','原序列地址:',id(tuple1))
#输出:
#原序列: (1, 2, 3) 
#原序列地址: 1554755553856
 
tuple1*=2
print('就地乘法后的序列:',tuple1,'\n','就地乘法后的序列地址:',id(tuple1))
#输出:
#就地乘法后的序列: (1, 2, 3, 1, 2, 3) 
#就地乘法后的序列地址: 1554728975712

参考文章:
https://zhuanlan.zhihu.com/p/33488349

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1242807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HT6809 3W 低 EMI 防削顶 D 类音频功率放大器的特点

HT6809是一款内部集成32阶数字音量控制以及防削顶失真功能且具有超低EMI的立体声免输出滤波器 D类音频功率放大器。 ◼ HT6809特点: ・防削顶失真功能(Anti-Clipping Function, ACF) ・超优异的全带宽EMI抑Z性能 ・免LC滤波器数字调制,直接驱动扬声器 ・32阶数…

uni-app开发小程序,利用scroll-view实现自动滚动至对应数据

uniapp scroll-view 官网 vue文件内容&#xff1a;dom: <scroll-view scroll-y :scroll-into-view"seqToView"><view class"pop-scroll"><viewv-for"(item,index) in seqList":id"seq- item":key"index"cl…

深入剖析预约上门服务系统源码:构建高效服务的代码之旅

在本文中&#xff0c;我们将深入研究预约上门服务系统的源码&#xff0c;透过代码的层层剖析&#xff0c;揭示系统背后的技术奥秘。我们将关注系统的核心功能&#xff0c;并通过代码示例演示其实现过程&#xff0c;为读者提供一个深度技术解读的体验。 1. 技术栈选择&#xf…

如何截留快手行业意向用户:10个合规方法大揭秘

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 随着互联网的发展&#xff0c;快手已成为一个巨大的流量池&#xff0c;吸引了无数用户。其中&#xff0c;不乏许多行业的意向用户。如何截留这些意向用户&#xff0c;成…

华为openGauss高斯数据库安装--docker方式

一、华为openGauss高斯数据库介绍 openGauss是一款华为开源的关系型数据库管理系统&#xff0c;它具有多核高性能、全链路安全性、智能运维等企业级特性。 openGauss内核早期源自开源数据库PostgreSQL&#xff0c;融合了华为在数据库领域多年的内核经验&#xff0c;在架构、事…

电脑找不到xinput1_3.dll怎么修复,快速处理dll问题的5个方法分享

在使用电脑的过程中&#xff0c;我们常常会遇到一些常见的问题&#xff0c;其中之一就是“电脑缺少xinput1_3.dll”。这个问题可能会影响到我们对电脑的使用体验&#xff0c;甚至导致某些软件无法正常运行。在我遇到这个问题并解决之后&#xff0c;我深刻地体会到了解决问题的重…

微信小程序其他环境都能显示在正式环境显示不出来

踩坑日记 用了uni.getImageInfo 用了uni.getImageInfo 本地开发环境&#xff0c;测试环境全都可以&#xff0c;就是更新到正式环境不显示。后面看代码百度了这个api发现图片所涉及的地址需要在小程序配置download域名白名单 https://uniapp.dcloud.net.cn/api/media/image.ht…

找JPG格式图片的地址(持续更新中)

问题描述&#xff1a;找JPG格式图片的地址 解决办法&#xff1a; 第一个 谷歌的images 第二个&#xff0c;搜狗图片和百度图片 不过下载是WEBP格式&#xff0c;可以使用一个在线WEBP格式转JPG格式的在线网站即可。 转换的网址为&#xff1a; https://ezgif.com/webp-to-j…

淘宝返利APP草柴如何绑定淘宝账号?

草柴APP是一款淘宝、天猫、京东大额优惠券领取及购物返利省钱工具。通过草柴APP绑定淘宝账号&#xff0c;可领取淘宝大额内部隐藏优惠券&#xff0c;领取成功再购物可享券后价优惠&#xff0c;确认收货后可获得淘宝返利。 淘宝返利APP草柴如何绑定淘宝账号&#xff1f; 1、手…

地埋式积水监测仪厂家批发,实时监测路面积水

地埋式积水监测仪是针对城市内涝推出的积水信息监测采集设备&#xff0c;采用超声波传感技术和超声波抗干扰功能&#xff0c;对路面的积水进行实时精准的监测。该设备能够在零下-5℃至高温70℃的严寒酷暑环境下可靠运行。它对城市道路积水进行实时监测并上报到监测系统之中&…

闹剧结束了?微软与0penAI亲密值上升!

原创 | 文 BFT机器人 在今天中午&#xff0c;山姆奥特曼在这场博弈双方原则上达成协议&#xff0c;他重返OpenAI担任CEO。而后微软CEO Satya 也对山姆奥特曼重新回归OpenAI发表了他和微软在这件事的立场&#xff0c;并表示合作关系更上一层。 OpenAI管理层的崩溃现截止今日终于…

vue项目使用easyplayer播放m3u8直播推流

官网 青犀视频 代码库 / 示例 / demo EasyPlayer 示例效果&#xff1a; 项目背景如图 后端给了m3u8的直播地址 协议是 hls / flv 市面上很多第三方热门播放库都可以完成该多屏播放方式 如Video.js 问题在于 分多屏时 会存在性能问题 并且关闭播放器后 即便删除Dom或调用停…

Linux---常用命令汇总

文章目录 关于目录操作的命令ls/llcdpwdmkdir 关于文件操作的命令touchechocatrmmvcpvim 关于查询操作的命令greppsnetstat 关于目录操作的命令 ls/ll ls : 列出当前目录下的目录和文件&#xff08;以行的展示形式&#xff09; ll &#xff1a; 列出当前目录下的目录和文件&…

项目管理中的资源日历是什么?有什么作用

管理项目不仅需要规划和预算&#xff0c;还需要日程安排。 资源日历是一种显示项目经理或团队领导在特定时间内可用资源的工具。这种类型的项目日历可以显示团队成员和设备在特定时间段内的可用工作时间。 例如&#xff0c;如果一名员工每天工作 8 小时&#xff0c;而他已经在…

逆向扒cocosjs安卓包教程-破解加密的js源码

本文只适用于cocosjs引擎打包的游戏apk,针对此类apk进行源码级别的逆向破解,可直接逐个破解工程内的源码部分,让游戏逻辑大白于你的面前,你可以针对js源码进行二次开发。按照我的教程破解过程中遇到什么问题,欢迎留言。 准备apk包 准备一个你确定用cocosjs打包好的apk包…

用uniapp在微信小程序实现画板(电子签名)功能

目录 一、效果展示 二、插件推荐与引入 三、代码具体应用 四、h5端将base64转换为url 一、效果展示 二、插件推荐与引入 手写板、签字板&#xff1b;<zwp-draw-pad /> - DCloud 插件市场 这个在微信小程序引入时内容简单&#xff0c;且涉及的方法很多&#xff0c;…

【考研数据结构代码题7】求一元多项式之和

题目&#xff1a;编写一个算法&#xff0c;求一元多项式之和 考纲&#xff1a;一元多项式的表示与相加 题型&#xff1a;代码填空或算法设计 难度&#xff1a;★★★ 参考代码 typedef struct node{float coef;//系数int exp;//次数struct node *next; }polynode; polynode *…

迅镭激光板材切割自动化生产线中标高端机械装备龙头豪迈集团!

近年来&#xff0c;中国制造业逐步由低端制造业向高端制造业迈进、由劳动密集型向技术密集型转变&#xff0c;智能制造带动了制造业生产环节的自动化、信息化、数字化、智能化的迭代升级。 位于山东省的高端机械装备龙头——豪迈集团&#xff0c;紧跟国家发展战略&#xff0c;加…

5 分钟,开发自己的 AI 文档助手!手把手教程

大家好&#xff0c;我是鱼皮。 几个月前&#xff0c;我自己开发过一个 AI 文档总结助手应用。给大家简单演示一下&#xff0c;首先我上传了一个文档&#xff0c;定义 1 1 等于 3&#xff1a; 然后把文档喂给 AI 文档总结助手&#xff0c;再向它提问&#xff0c;然后 AI 就回答…

将所有图片居中对齐

Ctrl h 调出替换框 ^g表示所有图片 格式里面选择段落 全部替换