上一篇笔记讲到globals老是固定指向模块名字空间,而locals则指向当前做用域环境python
在初步了解后,咱们甚至能够直接修更名字空间来创建关联引用,这与传统变量定义方式有所不一样数组
并不是全部时候都能直接操做名字空间,函数执行使用缓存机制,直接修改本地名字控件未必有效,在正常编码时,应尽量的避免直接修更名字空间缓存
在名字空间里,名字只是简单字符串主键,其自身数据结构里没有任何目标对象信息,经过名字访问目标对象的本质就是以名字做为主键去字典里读取目标对象指针引用。也正由于如此,名字能够从新关联另外一个对象,彻底不在意其类型是否与前任相同数据结构
赋值操做仅是让名字在名字空间里从新关联,而非修改原对象函数
和一个名字只能引用一个对象不一样,单个对象能够同时有多个名字,不管是在相同或不一样的名字空间里编码
必须使用is判断两个名字是否引用同一对象,相等操做符并不能肯定两个名字指向同一个对象,这涉及操做符重载,或仅用来比较值是否相等spa
理解方式:python中一次声明建立一个对象,1234被声明了两次,因此是不一样的对象,拥有不一样的id值,is是判断id值是否相同的,因此返回false,==是判断值是否相同,因此返回的是true.net
补充:3d
以下图所示,x和y值相同,且值为一个较小的值时,x is y被判断为true指针
引用
https://blog.csdn.net/xiongchengluo1129/article/details/78770177?utm_source=blogxgwz2
int清楚写了[-5, 256] 这些小整数被定义在了这个对象池里.因此当引用小整数时会自动引用整数对象池里的对象的. string对象也是不可变对象,python有个intern机制,简单说就是维护一个字典,这个字典维护已经建立字符串(key)和它的字符串对象的地址(value),每次建立字符串对象都会和这个字典比较,没有就建立,重复了就用指针进行引用就能够了. string实现了intern共享?我以为是一种空间效率和时间效率的妥协。相比于数字,string自己参与的运算要少不少,并且string自己占据的空间也大许多,所以string的主要问题在于不共享带来的空间浪费,因此string实现了很费时间的intern操做。对于数字状况正好相反。做为一个数字,须要作的运算要比string多太多了,并且大小比string也小不少。若是在计算10000+20000以前先花很久查找重复对象,致使一个1ms完成的加法花了100ms,我确定想砸电脑的。 float类型能够认为每一个赋值都是建立一个对象,由于float有点多,因此不必和int同样了. tuple它是不可变对象,理应和int和string同样会作一个缓存,可是书上没有说明,因而看了看源码,发现tuple的数据结构很简单,简单到不能再简单,就是一个数组,里面是元组的迭代对象,这个对象指向的是各个元素.最关键的是元组没有实现intern机制!因此元组虽然是不可变对象,但它同时也是一个数组,这个数组和c里的数组同样,每次建立都会分配内存空间。
因此上述代码中,由于123在这个小整数对象池里,因此两次申明其实指向了同一个对象,此时x和y拥有了同一个id值,因此此时 x is y被断定为true
总结:
Python中的对象包含三要素:id、type、value
其中id用来惟一标识一个对象
type标识对象的类型
value是对象的值
is判断的是a对象是否就是b对象,是经过id来判断的
==判断的是a对象的值是否和b对象的值相等,是经过value来判断的