先声明,是个人理解,不到位之处,是我个人问题。
先讲一个故事,很久很久以前有一个穷人,半辈子没发财,但是穷困半辈子,他学会穷的道理,并且悟出”省“的规律,如何利用有限的资源维持自己的生命,简单来说就是一物多用。
一块布,不仅仅是抹布同时还是洗碗布、毛巾。
再抽象说明:一块布是一个实体,而抹布、洗碗布、毛巾都是一个实体外在名称而已。
再抽象就是实体和引用的关系。
- 前言
- 1、python等号本质。
- 2、变量存放是指向地址,基础类型存放是内容,相同内容的变量指向地址是一样的。
- 3、列表、集合、字典、类对象是指向地址的变量。
- 4、参考
- 总结
在python中,一切都是对象。对象均具备三个属性:地址,类型,值
a = 1
数字1是一个实体,a是一个变量。
继续讲故事。
一天,程序入职一家大公司python,刚来先找公司解决住宿问题,于是到找脸黑的后勤部小经理系统说,”我需要一块洗碗布,麻烦放在厨房挂架上“。
系统觉得小事一件,高校毕业的新人,总是不太知道人与人相处之道。于是让人找了一块布过来并挂上去。然后走到程序跟前正儿八经说道:”这是一块抹布,给你放在挂架上了“。程序觉得怪怪,办完事就走呗,还跟我嘀咕什么放在那里了。
故事先讲一段,a=1执行后,系统做了下面事情过程如下:
于是在变量内存块创建a,然后看下实体内存块有没有1数值。如果有,就把1的内存地址传存到a;如果没有,就整个1出来,然后把地址存到a。后面遇到需要基本类型的数据都是这样操作。
a = 1 print(id(1)) # 1549269926128 print(id(a)) # 1549269926128
继续讲故事,第二天,程序找到系统要一块抹布擦桌子,系统找自己手下要来程序的配给的物资清单。
| 物资名称 | 物资 |
|---|---|
| 洗碗布 | 一块布 |
发现程序已经有了一块布——洗碗布,系统心想,抹布也就是布。系统说,”“你先回去,回头告诉你抹布在那里“,”难道房间里原来就有了”,程序也没多想,就先去工作了,看着程序走远,这时系统在物资清单上,左栏加了抹布,然后还画了一条虚线和之前”一块布“连起来。
| 物资名称 | 物资 |
|---|---|
| 洗碗布 | 一块布 |
| 抹布 | 同上 |
a = 1 b = 1 print(id(a)) # 1549269926128 print(id(b)) # 1549269926128
程序忙完一天回到宿舍,真看到了系统说的抹布,不过是洗碗布上贴了小字条,歪歪斜斜写着“抹布”。
这时候程序嘴都气歪了,这不是寒碜人吗?正准备找经理说理去,刚走到门外,发现宿舍对面的老王,用跟他一样的洗碗布正在淡定擦桌子,擦完拿去洗碗去了。
这时候程序冷静下来,回到宿舍,难道这是公司的环保理念,拿来考验新员工。一夜无眠,心想去摸摸底,看看怎么回事,于是一赶早找到经理系统办公前台,说要一卷纸上厕所用的。
系统按例看了程序的物资清单,看完心想一块布可不能当厕纸,布和纸是两回事。于是填了物资清单,仓库拿出一卷纸,递过去。
| 物资名称 | 物资 |
|---|---|
| 洗碗布 | 一块布 |
| 抹布 | 同上 |
| 厕纸 | 一卷纸 |
a = 1 b = 1 c = 2 print(id(a)) # 1549269926128 print(id(b)) # 1549269926128 print(id(c)) # 1549269926160
程序看着手中的纸,感觉特别怪异,软硬适中,感觉除了擦屁股以外,可能还有其他用途,可能也是想多了。
晚上又失眠了,回想之前一幕幕,感觉冥冥中指向一个真相,真相可能就是那张物资清单的内容。但是需要求证,于是赶早了又来前台,这次要东西多了一点,写了一个清单(一块毛巾、一本计算簿和一支圆珠笔)。
接过清单,经理系统习惯抽出程序的物资清单,想了想,然后写写画画的一顿操作,结果非常满意。放下物资清单反盖桌上,就喊人取物资来,愣是没人过来。想想算了,站起来径直走向仓库去拿物资。
看着系统去了仓库,程序立马把物资清单翻过看,一看头发都竖起来了。
| 物资名称 | 物资 |
|---|---|
| 洗碗布 | 一块布 |
| 抹布 | 同上 |
| 毛巾 | 同上 |
| 厕纸 | 一卷纸 |
| 计算薄 | 同上 |
| 圆珠笔 | 一支笔 |
a=1 b=1 c=2 list1=[1,2,3] print(id(a)) # 1549269926128 print(id(b)) # 1549269926128 print(id(c)) # 1549269926160 print(id(list1[0])) # 1549269926128 print(id(list1[1])) # 1549269926160 print(id(list1[2])) # 1513591996720 print(id(list1)) # 1513596904640
系统仓库回来看见程序一脸怒气盯着他,程序也看到系统手里就拿了一支笔。这下什么都明白了。气急败坏骂道:“真是一物多用,反正能用就行了是吧,厕纸也是计算簿,毛巾就是一块布,我要投诉你!我要找总经理投诉你!”
系统淡淡说到,我就是总经理。
故事讲完了。
在python里,所有基础数据 (整型、浮点型、字符串数值)创建后供变量引用其地址,就像a=1,b=1, a和b都是指向数值1的地址,变量名称变了,只要是实体一样都是指向同一个地址,如果没有明确定义的话。
a=1 b=1 c=2 print(id(a)) # 1549269926128 print(id(b)) # 1549269926128 print(id(c)) # 1549269926160 a=2 print(id(a)) # 1549269926160
这种做法节约内存空间,从老祖宗C到C++都是这样玩的,其他语言没考证过,不过应该差不到那里去。
3、列表、集合、字典、类对象是指向地址的变量。在python中列表、集合、字典、类对象这些变量都是指向地址,都是指向构成他们基础类型数据实体的一片地址,是一种容器指向地址,如果是间接地址,那通过间接地址找到基础类型数据实体地址。
Python 类,对象,数据分类,函数参数传递详解
总结
不管再怎么举例子,讲故事,都是只能是类比过程,永远没有实际运行程序看到结果贴切,但是如果真的没办法理解,造就很难记忆,找个临时替代理解还是有可取之处,自己认识也很肤浅,比喻不到位,且当我个人一些学习思路方向记录,聊以自慰。



