【循环引用及格式化输出】

news2024/11/8 9:45:37

垃圾回收机制

当一个值在内存中直接引用跟间接引用的量为0时,(即这个值没有任何入口可以找到它)那么这个值就会被清空回收♻️,释放内存空间;

列表在内存中的存储方式

在这里插入图片描述
1)引用计数的两种方式

x = "eat"
student_info = {
    "name": "paipai",
    "age": 10,
    "like": x
}
student_list = ['paipai', 10, x]
print(id(student_info["like"]))
print(id(x))
print(id(student_list[2]))

执行结果
在这里插入图片描述

循环引用

1)内存泄露
当循环引用的列表中,直接引用的关系被解除了,那么存在内存中的数据是没有办法被取到的,但由于他们之间互相引用,引用计数不为0,此时是无法被当成垃圾清理走的,在这种时候就会造成内存泄露。为了解决这种情况,python解释器设置了标记清除机制,来解决循环引用产生的这种致命问题;

堆区与栈区

在定义变量时,变量名与变量值都是需要存储的,分别对应内存中的两块区域:堆区与栈区。
变量名与值的内存地址的关联关系存放于栈区
变量的具体值存放于堆区,内存管理回收的则是堆区的内容
在内存中定义2个变量 x=10 y = 20,在堆区和栈区存放的关系如下:
在这里插入图片描述
当用y重新给x赋值时,其实是把x原先存在在栈区中对应堆区存放值的地址链接改为y对应的值,如下图所示
在这里插入图片描述
🤔️ 复杂的情况
如果出现列表之间互相引用呢,
x=10
L1 = [x,L2]
L2 =[20,30]
在这里插入图片描述
🏁循环引用
当出现循环引用时,变量的值不在被任何变量名关联,但是值的引用计数并不会为0,就会出现应该被回收但是不能被回收的情况。
举个🌰

# 定义l1变量
l1 = [xxx,l2]
l2 = [yyy.l1]
执行清除引用变量操作
del l1
del l2

当发生上述这样的情况时,在堆区和栈区会发生什么样的变化呢???👁下图示
当执行del操作时,会吧l1跟l2在栈区中对应堆区地址的指向关系给删除~,相当于把根给铲了
在这里插入图片描述
del摘掉直接引用

与用户直接交互

1)input接收用户输入,在python3中,input会将用户输入的所有内容都存成字符串类型
在这里插入图片描述
2)格式化输出(%,str.format f’String’)
%格式化输出,值按照位置与%s一一对应,少一个不行,多一个也不行
在这里插入图片描述
🙅🏻‍♀️如果想要在格式化输出的过程中输出%,是不能直接在后面跟个%或者是在前面加个转义/字符的,否则会一直报错。
在这里插入图片描述

解决方式
以字典形式传值,打破位置限制
在这里插入图片描述%s与%d的区别是什么
在这里插入图片描述

str.format
# 1、str.format按照位置传值(按列表传值)
res='my name is {} my age is {}'.format('paipai',18)
print("res的执行结果为: "+res)
# 存在多次引用时(根据传入的值在列表中的位置进行引用)
res2='my name is {0}{0}{0}{1} my age is {1}{1}'.format("paipai",18)
print("res2的执行结果为: "+res2)
# 2、打破位置的限制,根据字典的key:value进行传值
# 需要注意,正常的字典格式是{'key':'value'},但是在str.format中正确书写格式是 key=value,并且key是不用打引号的
res3='my name is {name},my age is {age}'.format(age=18,name='paipai')
print("res3的执行结果为: "+res3)

执行结果:
在这里插入图片描述
补充:使用str.format也可以使用这样的方式,打印出来的可读性更强

res="""
name:{}
age:{}
sex:{}
""".format('paipai',18,'boy')
print(res)

执行结果
在这里插入图片描述
了解

# format新增
print('{x}=========='.format(x='开始执行'))
#1、补充占位字符,
print('{x:=<10}'.format(x='开始执行'))  # 如果format输入的字符小于10,则在后面填充=,直到输出的字符串刚好为10个,format输入的字符靠左显示
print('{x:=>10}'.format(x='开始执行'))  # format输入的字符靠右显示,且如果输入的字符小于10,则自动补充=,直到输出的字符串刚好为10个
print('{x:=^10}'.format(x='开始执行'))  # format输入发字符居中显示,且如果输入发字符小于10则自动补充=,直到输出的字符串刚好为10个
# 2、对输入的结果进行四舍五入
print('{pai:.3f}'.format(pai=3.1415926))

执行结果
在这里插入图片描述

f’string’
x=input('you name:')
y=input('you age is: ')
res=f'我的名字是{x} 我的年龄是{y}'
print(res)

执行结果
在这里插入图片描述
升级
输出一个{ }

x='paipai'
y=18
res=f'name:{{{x}}},year:{y}'
print(res)

在这里插入图片描述

字符串转换成表达式运算

# 字符串转换成表达式运算
data='10+3'
res=f'{data}'
print(res)
#要将字符串转化为表达式进行运算
res2=f'{10+3}'
print(res2)
print(res2)
#f'{xxx}'普通字符串中的内容当一个功能运行
f'{print("aaaa")}'

运行结果
在这里插入图片描述

基本运算符

算术运算符

# 基本运算符
# 1、算术运算符
print(10+3.1)
print(10+3)
print(10/3)# 结果带小数
print(10//3)# 结果只保留整数部分
print(10 % 3)# 取模(取余数)
print(10**3)# 乘法运算

执行结果
在这里插入图片描述

比较运算符

# 2、比较运算符: >  >= <  <=  ==  !=
print(10>3)
print(10==10)
print(10>=10)
print(10>=9)
print(10<3)

执行结果
在这里插入图片描述

#  == 判断左右两个值是否相等
name=input('your name:')
print(name == 'paipai')
print('my really name is: '+ name)

执行结果
在这里插入图片描述

3)赋值运算符

# 赋值运算符
# = 代表变量的赋值
age = 18
# 执行年龄自动+1
age = age + 1
age += 1
print(age)
# 上述两个表达式都是同一个意思,同理可得
age *= 3
age /= 5
# age %= 3
# age **= 3  ##两个星号表示平方
print(age)

执行截图
在这里插入图片描述
3.3 链式赋值

x = 10
y = x
z = y
#上述操作可以直接使用链式赋值来解决
z = x = y #链式赋值
print(x,y,z)
print(id(x),id(y),id(z))

执行结果截图
在这里插入图片描述
3.4 交插赋值

# 交叉赋值
m = 20
n = 10
z = 30
print(m, n, z)
(n, m, z) = (m, z, n)
print(m, n, z)

执行截图
在这里插入图片描述

3.4 解压赋值

# 解压赋值
salaries = [4, 10, 16.5, 12]
# 普通的方式
# year0=salaries[0]
# year1=salaries[1]
# year2=salaries[2]
# year3=salaries[3]
# 优化后的方式
year0, year1, year2, year3 = salaries
print(year0, year1, year2, year3)

执行截图
在这里插入图片描述
重点注意
执行解压赋值时,变量名比列表多一个值或者是少一个值都是不可以的,会出现匹配不上的情况导致报错。
在这里插入图片描述
引入,帮助我们取2头的值,但是无法取中间*

# 在进行解压赋值时,如何通过操作只取首尾的值?
# 定义一个列表
salaries = [4, 10, 16.5, 12, 18]
# 只取前几个的值,比如取前3个
x, y, z, *_ = salaries
print(x, y, z, _)
# 只取后几个的值,比如取后2个
*_,a,b=salaries
print(a,b)

执行结果
在这里插入图片描述

解压字典(默认解压出字典的key)

# 解压字典
# 1、定义一个字典
student_info = {
    'name': 'paipai',
    'age': 18,
    'like': 'eat'
}
x, y, z = student_info
print(x,y,z)

在这里插入图片描述

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

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

相关文章

31.7K+ Star!AgentGPT:一个在浏览器中运行的Agent

AgentGPT 简介 AgentGPT[1] 是一个可以让你在浏览器中组装、配置和部署自主AI代理的项目。你可以为你的自定义AI命名,并让它去实现任何你想象中目标。它将尝试通过思考要执行的任务、执行它们并从结果中学习来达成目标。 项目特点 主要特点 自主AI代理:用户可以自定义AI并赋…

【大模型】通过Crew AI 公司的崛起之路学习 AI Agents 的用法

AI 技术的迅猛发展正以前所未有的速度重塑商业格局&#xff0c;而 AI Agents&#xff0c;作为新一代的智能自动化工具&#xff0c;正逐步成为创新型公司的核心力量。在本文中&#xff0c;我们将探讨如何利用 AI Agents 构建一家 AI 驱动的公司&#xff0c;并详细了解 Crew AI 创…

【Uniapp】Uniapp Android原生插件开发指北

前言 在uniapp开发中当HBuilderX中提供的能力无法满足App功能需求&#xff0c;需要通过使用Andorid/iOS原生开发实现时&#xff0c;或者是第三方公司提供的是Android的库&#xff0c;这时候可使用App离线SDK开发原生插件来扩展原生能力。 插件类型有两种&#xff0c;Module模…

网页版五子棋——用户模块(服务器开发)

前一篇文章&#xff1a;网页版五子棋—— WebSocket 协议-CSDN博客 目录 前言 一、编写数据库代码 1.数据库设计 2.配置 MyBatis 3.创建实体类 4.创建 UserMapper 二、前后端交互接口 1.登录接口 2.注册接口 3.获取用户信息 三、服务器开发 1.代码编写 2.测试后端…

Jenkins声明式Pipeline流水线语法示例

系列文章目录 docker搭建Jenkins2.346.3版本及常用工具集成配置(ldap、maven、ansible、npm等) docker安装低版本的jenkins-2.346.3,在线安装对应版本插件失败的解决方法 文章目录 系列文章目录jenkins流水线基础1、pipeline1.1、什么是pipeline&#xff1f;1.2、为什么使用pi…

【NLP】使用 SpaCy、ollama 创建用于命名实体识别的合成数据集

命名实体识别 (NER) 是自然语言处理 (NLP) 中的一项重要任务&#xff0c;用于自动识别和分类文本中的实体&#xff0c;例如人物、位置、组织等。尽管它很重要&#xff0c;但手动注释大型数据集以进行 NER 既耗时又费钱。受本文 ( https://huggingface.co/blog/synthetic-data-s…

【数据集】【YOLO】【目标检测】道路裂缝数据集 5466 张,YOLO/VOC格式标注!

数据集介绍 【数据集】道路裂缝数据集 5466 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。数据集中包含一种分类&#xff0c;检测范围城市道路裂缝、高速道路裂缝、乡村道路裂缝。 戳我头像获取数据&#xff0c;或者主页私聊博主哈~ 一、数据概述 道路裂缝检测…

C++用string实现字符串相加

. - 力扣&#xff08;LeetCode&#xff09; -》》》》》题目链接 实现思路&#xff1a;计算数字符串长度并用数组的方式计算出字符位置&#xff0c;用字符的ask码‘0’计算出字符本身。 class Solution { public:string addStrings(string num1, string num2) {string str;int…

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头

easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头 原版表头和表体字体美化自动拼接错误提示列自适应宽度自动合并单元格使用Easyexcel使用poi导出 在后台管理开发的工作中,离不开的就是导出excel了. 如果是简单的导出, 直接easyexce…

brainpy 动力学编程基础

文章参考&#xff1a; 《神经计算建模实战——基于brainpy》 吴思 【brainpy学习笔记】基础知识2(动力学模型的编程基础)-CSDN博客 Brainpy手册 文章目录 积分器&#xff1a;定义ODE函数数值积分方法 更新函数和动力系统计算介绍什么是brainpy.DynamicalSystem&#xff1f;如…

高级图像处理工具

图像处理-高级 1、功能概览 随着社交媒体的普及和个人创作需求的增长&#xff0c;图像处理成为了日常生活中不可或缺的一部分。无论是专业的设计师还是爱好者&#xff0c;都需要一款强大的工具来帮助他们完成各种任务。今天&#xff0c;我们将介绍一款基于Python开发的高级图…

【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作

目录 一、安装Zookeeper 二、配置Zookeeper集群 三、Zookeeper服务的启动与关闭 四、Zookeeper的shell操作 前情提要&#xff1a;延续上篇【Hadoop和Hbase集群配置】继续配置Zookeeper&#xff0c;开启三台虚拟机Hadoop1、Hadoop2、Hadoop3&#xff0c;进入终端&#xff0c…

Transformer和BERT的区别

Transformer和BERT的区别比较表&#xff1a; 两者的位置编码&#xff1a; 为什么要对位置进行编码&#xff1f; Attention提取特征的时候&#xff0c;可以获取全局每个词对之间的关系&#xff0c;但是并没有显式保留时序信息&#xff0c;或者说位置信息。就算打乱序列中token…

Python爬虫如何处理验证码与登录

Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时&#xff0c;通常会遇到两个主要问题&#xff1a;登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码&#xff0c;以便进…

《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析

导读&#xff1a;SQL 诞生于 20 世纪 70 年代&#xff0c;至今已有半个世纪。SQL 语言具有语法简单&#xff0c;低学习门槛等特点&#xff0c;诞生之后迅速普及与流行开来。由于 SQL 具有易学易用的特点&#xff0c;使得开发人员容易掌握&#xff0c;企业若能在其计算机软件中支…

JS实现,防抖节流 + 闭包

防抖&#xff08;Debounce&#xff09; 防抖是指短时间内大量触发同一事件&#xff0c;只会在最后一次事件完成后延迟执行一次函数。 防抖的典型应用场景是输入框的搜索建议功能&#xff0c;用户输入时不需要每次输入都去查询&#xff0c;而是在用户停止输入一段时间后才进行…

安卓编程最方便的读写资料类SharedPreferences,多个APP共享

本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种&#xff1a; 使用SharedPreferences存储数据 …

数据分析:转录组差异fgsea富集分析

文章目录 介绍加载R包数据链接导入数据数据预处理DE testing: 2BP vs no-BP比较limma-voomLoad steroid dataIn No-BP patientsIn 2BP patientsCompare gene expression vs bacterial mass其他系统信息介绍 转录组差异fgsea富集分析是一种基于基因集的富集分析方法,它关注的是…

Day13杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> res new Arra…

Avalonia11如何优雅的跨组件通信

背景&#xff1a; 官网只介绍了推荐适用ReactiveUI&#xff0c;没有过多的案例介绍&#xff0c;对于初入桌面应用开发的小白极其不友好。 本文介绍在Avalonia应用中通过ReactiveUI中的MessageBus进行跨组件通信. 假设需求案例&#xff1a; MainWindowViewModel中发送消息&a…