小白关于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 ...
随机推荐
- Kafka 学习笔记-基本概念
一.基本概念 Kafka是一个分布式的,可分区的,可复制的消息系统 Kafka以由一个或多个服务以集群的方式运行,服务叫broker producer,consuer通过kafka topic发布,预 ...
- RabbitMQ 笔记-工作队列
工作队列的主要思想是不用等待资源密集型的任务处理完成, 为了确保消息或者任务不会丢失,rabbitmq 支持消息确信 ACK.ACK机制是消费者端从rabbitmq收到消息并处理完成后,反馈给rabb ...
- PhiloGL学习(4)——三维对象、加载皮肤
前言 上一篇文章中介绍了如何响应鼠标和键盘事件,本文介绍如何加载三维对象并实现给三维对象添加一个漂亮的皮肤. 一. 原理分析 我对三维的理解为:所谓三维对象无非是多个二维对象拼接到一起,贴图就更简单了 ...
- Oracle存储过程跨用户执行查询报错
在Oracle中,在USERA下编写一个存储过程,该存储过程中引用了另一个用户USERB下的表或视图对象.编译该存储过程,出现编译错误.报ORA-00942: table or view does n ...
- Spring读书笔记——bean创建(下)
有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...
- linux学习(五)系统目录结构,ls命令,文件类型,alias
一.系统目录结构 在我们的根目录下,有这样一些文件夹 /bin /sbin /usr/bin /usr/sbin /sbin一般都是root用户用的 /boot 系统启动相关的,grup就放在这里,这 ...
- Strategic Game
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- IdentityServer4 实现自定义 GrantType 授权模式
OAuth 2.0 默认四种授权模式(GrantType): 授权码模式(authorization_code) 简化模式(implicit) 密码模式(password) 客户端模式(client_ ...
- python基础知识——基于python3.6
语法糖 # # -*- coding: utf-8 -*- # #------------- # #--------- 语法糖--------------- # #------------------ ...
- Oracle-2 - :超级适合初学者的入门级笔记--定义更改约束,视图,序列,索引,同义词
接着我上一篇的写,在这感觉到哇 内容好多啊 上一篇,纯手打滴,希望给个赞! 添加约束的语法: 使用 alter table 添加或删除约束,但是不能修改约束 有效化或无效化约束 添加not nul ...