Python3 学习笔记 3 之 名字空间及内存管理

静态编译语言动态解释型语言对于变量名的处理方式完全不同。

对于静态编译语言:静态编译器或者链接器会以固定地址,或直接、间接寻址指令代替变量名。也就是说变量名不参与执行过程。

对于动态解释型语言:名字和对象通常是两个运行期的实体,名字不但有自己的类型,还需分配内存并介入执行过程。


在python中,如何通过名字找到内存呢

我们可以将内存寻址比作顾客按照编号找服务柜台。名字就是一个接待员,顾客只能通过接待员与柜台互动。这样就增加了中间环节和额外的开销,所以对性能不利,但这样的好处是接待员和柜台之间有更多的可调整空间。

最后,名字必须与目标对象关联起来才有意义。

最直接的关联方式就是赋值,当给一个名字赋值时,就是在名字空间内将两者建立联系,这里的名字空间其实就是一个字典

名字和目标对象的联系也仅是引用关联。名字只负责找人,但具体这个人是什么状态,名字不管。只能在运行期才能知道名字引用的对象类型,所以python才是动态类型语言。

在python中当名字与目标对象建立联系时,名字有类型

但若没有建立联系时则会


名字空间(namespace)是上下文环境里专门用来存储名字和目标引用关联的容器

每个模块(源码文件)都有一个全局名字空间,这里面存放的都是全局变量,有全局名字空间,当然就有本地名字空间或称当前名字空间。如果直接在模块级别执行,那么当前名字空间和全局名字空间相同。但在函数内,当前名字空间就专指函数作用域。

提到这里就不得不提python的两个方法:globals()和locals()。

其中globals()总是固定指向模块名字空间 locals()则是指向当前作用域环境

甚至可以直接操作名字空间来建立关联应用。如

globals()['hello'] = 'hello world'

这样就在名字hello与对象‘hello world’间建立了关联

但是由于函数执行使用缓存机制,并非所有时候都能直接操作名字空间,应尽量避免直接修改名字空间。

为什么在python中,名字可以重新关联另一对象,完全不用考虑其类型?

因为在名字空间的字典里,名字只是简单字符串主键,其自身数据结构里没有任何目标对象信息。通过名字去访问目标对象,就是以名字为主键去字典里读取对象的指针引用。正是由于这个原因所以在python中名字可以重新关联另一对象并且完全不用考虑其类型。


单个对象可以有多个名字,这些名字无论是在相同或者不同的名字空间里。

这里需要知道要判断2个名字是否引用了同一个对象,相等操作符并不能确定两个名字指向同一个对象,这里涉及到操作符重载。


上面这里的程序,可能有人会疑问,为什么a和b,c和d都是同样的数字,为什么a和b是同一个引用,而c和d不是。

这里因为是python自身优化了,本来a和b也不应该是同一个引用。是由于python自己有个数据缓冲池,当给的数小于这个数据缓冲池的阈值,python会自动优化使a和b指向同一个对象,这样是为了节省内存。但当给的数超过了这个数,就会明白,其实这是2个不同的引用。c == d的原因是比较c和d指向的对象是否相等,很明显相等。故上述程序得解。

在python中,没有值的类型,也没有引用类型之分。事实上,每个对象都很重,即使是最简单的数字,也有标准的对象头以及保存类型指针和引用计数等等信息。如果是列表,字符串等还会有记录数据项长度的,然后才是上面的状态信息。可以用python的标准库sys里的sys.getsizeof()方法来查看对象的长度。如:



总是通过名字来完成‘引用传递’(pass-by-reference)。名字关联会增加对象的计数,反之就会减少,当某一个对象的引用计数减少到0时,该对象会被系统回收。这就是默认的引用计数的垃圾回收机制。

但是有时候,当两个或两个以上的对象构成循环引用时(单个对象也能构成循环,比如列表把自身作为元素存储在自身里),该机制就会遭遇麻烦。因为彼此的引用会导致计数永不归零,无法触发回收机制,从而形成了内存泄露。为此有一套专门用来处理循环引用的垃圾回收器(gc)。

关于引用计数 和 循环计数的详细知识,下一节再详细展开

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值