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

news/2024/11/8 10:26:04/

垃圾回收机制

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

列表在内存中的存储方式

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

python">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,就会出现应该被回收但是不能被回收的情况。
举个🌰

python"># 定义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
python"># 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也可以使用这样的方式,打印出来的可读性更强

python">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’
python">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")}'

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

基本运算符

算术运算符

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

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

比较运算符

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

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

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

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

3)赋值运算符

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

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

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

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

python"># 交叉赋值
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.ppmy.cn/news/1545333.html

相关文章

「Mac畅玩鸿蒙与硬件26」UI互动应用篇3 - 倒计时和提醒功能实现

本篇将带领你实现一个倒计时和提醒功能的应用&#xff0c;用户可以设置倒计时时间并开始计时。当倒计时结束时&#xff0c;应用会显示提醒。该项目涉及时间控制、状态管理和用户交互&#xff0c;是学习鸿蒙应用开发的绝佳实践项目。 关键词 UI互动应用倒计时器状态管理用户交互…

Objective-C 音频爬虫:实时接收数据的 didReceiveData_ 方法

在互联网技术领域&#xff0c;数据的获取和处理是至关重要的。尤其是对于音频内容的获取&#xff0c;实时性和效率是衡量一个爬虫性能的重要指标。本文将深入探讨在Objective-C中实现音频爬虫时&#xff0c;如何高效地使用didReceiveData:方法来实时接收数据&#xff0c;并通过…

Android Studio 运行模拟器无法打开avd

问题&#xff1a;已经下载了HAXM 打开模拟器时还是提示未下载HAXM&#xff0c;无法打开avd 解决方案&#xff1a; 控制面板 -> 启动或关闭Windows功能&#xff0c;打开图下两项&#xff0c;后重启电脑重启Android Studio&#xff1a;

除草机器人算法以及技术详解!

算法详解 图像识别与目标检测算法 Yolo算法&#xff1a;这是目标检测领域的一种常用算法&#xff0c;通过卷积神经网络对输入图像进行处理&#xff0c;将图像划分为多个网格&#xff0c;每个网格生成预测框&#xff0c;并通过非极大值抑制&#xff08;NMS&#xff09;筛选出最…

鸿蒙ArkTS中的获取网络数据

一、通过web组件加载网页 在C/S应用程序中&#xff0c;都有网络组件用于加载网页&#xff0c;鸿蒙ArkTS中也有类似的组件。   web组件&#xff0c;用于加载指定的网页&#xff0c;里面有很多的方法可以调用&#xff0c;虽然现在用得比较少&#xff0c;了解还是必须的。   演…

STM32 BootLoader 刷新项目 (八) 读取Flash保护ROP-0x54

STM32 BootLoader 刷新项目 (八) 读取Flash保护ROP-0x54 下面我们来介绍一下BootLoader一上电对芯片Option Byte操作的过程&#xff0c;Option Byte可以配置的功能包括**Read protection (RDP) **读出保护级别&#xff0c;**BOR级别&#xff08;Brown-out Reset&#xff09;**…

# SpringMVC学习

SpringMVC 1、SpringMVC是什么&#xff1f; SpringMVC 是 Spring 框架的一个模块&#xff0c;专门用于构建 Web 应用程序。它基于 Model-View-Controller (MVC) 设计模式&#xff0c;帮助开发者将应用程序的不同部分&#xff08;模型、视图和控制器&#xff09;分离&#xff…

人工智能:重塑生活与工作的神奇力量

人工智能&#xff0c;宛如一颗璀璨的科技之星&#xff0c;正以燎原之势改变着世界。从医疗到企业&#xff0c;从生活点滴到出行方式&#xff0c;它无处不在。 在医疗领域&#xff0c;诊断疾病不再仅仅依靠医生的经验。AI 系统能够快速分析大量的病例数据&#xff0c;识别出细微…