小白关于python 对象和内存的关系的一些感悟和疑惑,望大神指教
首先你输入了一个字符串,这个字符串是有大小的,电脑将其放在内存中,自动给其一个起始指针指向这个字符串的首位置,然后,你将这个字符串赋值给一个变量,这个对象又在内存中开辟出一个空间,这个变量会自动连接这个指向字符串起始位置的指针,然后你又将这个变量赋值给变量2,内存中又开辟出一个空间存放变量2的空间。那么,这个变量2把连接变量1的那个指向字符串起始位置的指针给抢走了,变量1就没有指针可连,如果它很长时间都是孤家寡人的话,它就失去了作用,失去了作用,就会被python中的垃圾清理站给回收。
如果你不想让你的变量1失去作用的话,就赶紧给他赋予一个字符串,他就又有指针可连,就有了工作,避免了被垃圾回车站清理;
>>> name = "jack"
>>> name2 = "jack"
>>> print(name)
jack
>>> print(name2)
jack
>>> id(name)
60831136
>>> id(name2)
60831136
>>>
但有一个问题,上述代码怎么回事?是不是这两个变量都连接了指向字符串jack初始指针。那也就意味着是不是name就不应该永久清除?不明白啊!
为什么两个变量id是相同,因为字符串这个对象指针的初始位置是在内存中是不变的,so,可以得出一个结论,变量的id是根据字符串在内存中的位置所决定的!不知对不对?
我在一些资料上看到说,程序中必有算法,算法中必有数据,数据是由变量和常量组成,变量和常量有5种数据类:字符型、整型、浮点型、布尔型、空型!
也就是说变量有数据类型,但下面这个代码又如何解释呢?
name = "jack"
>>> type(name)
<class 'str'>
>>> name = 123
>>> type(name)
<class 'int'>
>>>
name这个变量有两种类型,str和int。。所以我认为,变量应该没有类型,变量所引用的对象(1行的“jack”,,4行的“123”)才有类型,否则如何解释??
list = [ "jack" , "tree" , 123 , "apple" ]
>>> id(list)
60721432
>>> list[3] = "apppppppppppppppppppppppppppppppppppppppppppppppple"
>>> print(list)
['jack', 'tree', 123, 'apppppppppppppppppppppppppppppppppppppppppppppppple']
>>> id(list)
60721432
>>>
上述这段代码,明明列表中的元素都改变,前面说过,变量的id是由对象决定,可现在对象中的内容都改变呢,怎么变量的id还不变呢?
我猜,这就是传说中的可变对象,列表中的每个元素都应该有个指针,这个指针的初始位置是不变的,定义了四个元素,应该有四个指针,这四个初始位置的指针分别是0,1,2,3
然后变量用一根线连接这四个指针的初始位置,所以无论列表中的元素怎么变,那四个指针的初始位置是一定的,那根线也是一定的,so,,变量连接对象的指针初始位置不变,id也不变,,终结结论,变量的id由连接指向对象的初始位置的指针所决定!(纯属遐想^_^)
小白关于python 对象和内存的关系的一些感悟和疑惑,望大神指教的更多相关文章
- Python 用ctypes观察Python对象的内存结构 -- (转)
!!!强烈推荐的好文章!!! 对象的两个基本属性 Python所有对象结构体中的头两个字段都是相同的: refcnt:对象的引用次数,若引用次数为0则表示此对象可以被垃圾回收了. typeid:指向描 ...
- 小白学Python(18)——pyecharts 关系图 Graph
Graph-基本示例 import json import os from pyecharts import options as opts from pyecharts.charts import ...
- python如何从内存地址上加载pythn对象
python如何从内存地址上加载pythn对象 在python中我们可以通过id函数来获取某个python对象的内存地址,或者可以通过调用对象的__repr__魔术函数来获取对象的详细信息 def t ...
- python的变量,对象的内存地址以及参数传递过程
作为一个由c/c++转过来的菜鸟,刚接触Python的变量的时候很不适应,应为他的行为很像指针,void* ,不知道大家有没有这样的感觉.其实Python是以数据为本,变量可以理解为标签.作为c/c+ ...
- cPickle对python对象进行序列化,序列化到文件或内存
pickle模块使用的数据格式是python专用的,并且不同版本不向后兼容,同时也不能被其他语言说识别.要和其他语言交互,可以使用内置的json包 cPickle可以对任意一种类型的python对象进 ...
- 《转》python对象
http://www.cnblogs.com/BeginMan/p/3160044.html 一.学习目录 1.pyhton对象 2.python类型 3.类型操作符与内建函数 4.类型工厂函数 5. ...
- 小白学 Python 数据分析(11):Pandas (十)数据分组
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- Python 对象的引用计数和拷贝
Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...
- Python对象体系揭秘
Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://doc ...
随机推荐
- JS的基本类型(小知识)
一:js中的基本类型: 基本类型:boolen, string ,number,null,undefined 引用类型:object,和函数 二.undedifned和null的区别: 1 undef ...
- LeetCode 59. Spiral Matrix II (螺旋矩阵之二)
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...
- <ul>标签设计简单导航栏
当我们刚开始学习html/css的时候,对于padding .float.行内元素.块级元素用起来可能会混淆,但是呢我们可以通过一个简单的nav案例来清楚各自具体作用. 1.首先我们创建一个大的容器, ...
- Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现(不定期更新中~~~)
目录 Unity3D手机斗地主游戏开发实战(01)_发牌功能实现 Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现 一.大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和 ...
- javascript 备忘 细节 相关
DOMContentLoaded事件触发时机,即dom tree完成但页面未必渲染完毕. var a = [1,2,3,4]; var length = a.length; alert((leng ...
- Python爬虫入门:Urllib库的高级使用
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- ldap数据库--ldapsearch,ldapmodify
简单介绍一下ldapsearch命令,在ldap搜索条目时很有用,只要适当调整filter就可以. 命令如下: ldapsearch -h hostname -p port -b baseDN -D ...
- PHP基础入门(三)【PHP中的数组】
PHP数组的分类 按照下标的不同,PHP数组分为关联数组与索引数组: 索引数组:下标从0开始,依次增长: 关联数组: 下标为字符串格式,每个下标字符串与数组的值一一关联对应.(有点像对象的键值对) 关 ...
- Linux服务器上安装vsftpd
1.首先判断你服务器上是否安装了vsftpd rpm -q vsftpd 2.安装vsftpd yum -y install vsftpd 3.重启vsftpd service vsftpd ...
- Jdbc访问数据库篇
一万年太久,只争朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持 java. ...