变量赋值
<1>赋值操作符 =
Python语言中,等号(=)是主要的赋值操作符。
<2>增量赋值x += 1
(不支持x++)
<3>多重赋值x = y = z = 1
<4>多元赋值 x, y = 1, 2
问0:如果x=1的话,那么x变量里面保存的就是数值1咯?
答:不不不,x里面保存的是1的地址,相当于x的变量是贴到1这个地址上的。
问1:为什么有变量,为什么要有变量赋值?
答:我的想法是,如果数字1存储在 内存地址 0x7FFFFF0000 中,如果每次都要写 0x7FFFFF0000 岂不是很麻烦 ,那么就简单一点我们起个变量名叫x 岂不美哉。
问2: 如何看待Python语言中,对象是通过引用传递的?
答:这个问题和问题0是差不多的,Python赋值语句会把对象值存储在变量名或者数据结构的元素中,赋值语句总是建立对象的引用值,而不是复制对象,因此Python变量更像是指针,而不是数据存储区域。
标识符
<1> 合法的Python标识符
第一个字符必须是字母或者下划线
剩下的字符可以是字母和数字或下划线
大小写敏感
<2>关键字
语言的标识符,保留字
<3>内建
不是保留字,但是不推荐使用
<4>.专用下划线标识符
_xxx 不用 "from module import *" 导入
xxx 系统定义名字
_xxx 类中的私有变量名
问3:如何看待Python中单下划线和双下划线的区别?
_name_:一种约定,Python内部的名字,用来与
用户自定义的名字区分开,防止冲突
_name:一种约定,用来指定变量私有
__name:解释器用_classname__name来代替这个名字用以区别和其他类相同的命名
想要更加详细的了解这两者的区别,请点击:Python中的下划线(译文)**
基本风格指南
问:什么是PEP8?
答:一种Python编码风格指导规范。
内存管理
- 无需变量实现声明
- 无需变量指定类型
- 不用关心内存管理
- 变量名会被回收
- del 语句能够直接释放资源
<1>变量定义
变量在第一次被赋值的时会自动声明
<2>动态类型
解释器会根据语法和右侧的操作数来决定对象的类型
<3>内存分配
交给Python
<4>引用计数
- 增加引用计数
x = 3
y = x
- 减少引用计数
x = 3
y = x
x = 4
- del语句
会删除对象的一个引用 - 垃圾收集
垃圾收集器会寻找引用计数为0的对象。
问4:Python的垃圾回收机制是一种怎样的体验?
答:
引用计数为主,标记-清除和分带为辅
引用计数: 引用计数为0,内存释放。
标记-清除 容器对象 引用循环 定时回收
分代收集 划分三代
想要知道Python垃圾回收机制的详细情况 请点击:深入分析 Python 的垃圾回收机制**
问5:如何评价引用计数?
答:
引用计数为0时,该对象生命就结束了。
引用计数机制的优点:
1、简单
2、实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
引用计数机制的缺点:
1、维护引用计数消耗资源
2、循环引用
举个例子
1 list1 = []
2 list2 = []
3 list1.append(list2)
4 list2.append(list1)
list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,这将是致命的。
对于如今的强大硬件,缺点1尚可接受,但是循环引用导致内存泄露,注定python还将引入新的回收机制。
所以说就有了 标记-清除 和 分代收集
标记-清除 主要是要清除哪种情况呢?
答:“标记-清除”是为了解决循环引用的问题。
就是上面那种情况.
分代收集 主要是为了解决哪种情况呢?
答: 将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,就应该减少对它的垃圾收集频率。
网友评论