python中的id是否就是对象的python 访问内存地址址?

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我有这样一段Python代码
l1 = [12, 13, 14, 15, 16]
# 列表l1中元素的id
id_l1 = [id(n) for n in l1]
# 打印列表l1中元素的id
print("id_l1: ", id_l1)
# 打印数字n1的id
print("id_n1", id(n1))
l2 = [12, 13, 14, 15, 16]
# 列表l2中元素的id
id_l2 = [id(n) for n in l2]
# 打印列表l2中元素的id
print("id_l2:", id_l2)
print(id(l1))
print(id(l2))
我尝试通过上面代码去查看变量的内存地址。我预想的是列表中元素的内存地址和整数变量的内存地址是不同的,且不同列表中的元素的内存地址也应该是不同的,但是我得到了这样的结果:
# 上诉代码的运行结果
[, , , , ]
id_l2: [, , , , ]
可见,l1中数字12元素的内存地址和整数n1的内存地址一样,且列表l1和列表l2中元素的内存地址完全一样,虽然l1和l2的内存地址不一样。请问Python的内存地址分配的规则到底是什么样的呢?亦或者是id()函数所返回的并不是真实的内存地址呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
1.需要搞清楚可变对象和不可变对象,list 可变,int不可变2.这个是id函数的定义
def id(*args, **kwargs): # real signature unknown
Return the identity of an object.
This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)
你会发现相邻数字之间的差值也是一样的(32), 所以他们是在内存里整齐排列的。
3.Python 一切皆对象, int 实际上是 type的类的实例(可以id(int)),实际上在内存里int的地址就是和整数对象排列在一起。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我查到几篇博客了有相关内容的讲解:
这种机制不知道是叫小整数对象池还是小对象整数池,反正原理大概就是这样。。。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
小对象整数池
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:2017年11月 其他开发语言大版内专家分月排行榜第二2016年12月 其他开发语言大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。python可以通过id来看内存地址,那么有方法能通过内存地址看有哪些变量指向这个内存地址么?????_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
python可以通过id来看内存地址,那么有方法能通过内存地址看有哪些变量指向这个内存地址么?????
我有更好的答案
再反序列化就可以实现。操作完成后,再传递回来。这就是原理。如果使用指定内存地址也是可以的。可以设计一个共享内存,然后通过numpy这个模块进行内存与对象的转换。 其实python这个东西你找一找这个库,rpyc。这个东西是目前RPC方面最好用的一个东西了,可扩展性。你在一个进程中创建一个对象,可以使用python自带的系列化模块pickle进行转换。然后传递到另一个进程中。其它的就不多说了。 当然你也可以自己设计序列化与反序列化模块。通常复杂的对象效率低。比我以前接触学习的分布式对象系统更好用,因为是脚本,序列化与反序列化。这样才能实现高效,所以做分布式对象特别容易。主要是做好系列化与反系列化就可以了。此外rpc-xml也是常用的一个方法。如果你对需求理解深,通常不会选择分布式对象,而是自己定制数据结构,传输协议
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包4被浏览377分享邀请回答02 条评论分享收藏感谢收起写回答Python中获取对象信息的方法
作者:廖雪峰
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Python中获取对象信息的方法,是Python学习当中的基础知识,需要的朋友可以参考下
当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?
使用type()
首先,我们来判断对象类型,使用type()函数:
基本类型都可以用type()判断:
&&& type(123)
&type 'int'&
&&& type('str')
&type 'str'&
&&& type(None)
&type 'NoneType'&
如果一个变量指向函数或者类,也可以用type()判断:
&&& type(abs)
&type 'builtin_function_or_method'&
&&& type(a)
&class '__main__.Animal'&
但是type()函数返回的是什么类型呢?它返回type类型。如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同:
&&& type(123)==type(456)
&&& type('abc')==type('123')
&&& type('abc')==type(123)
但是这种写法太麻烦,Python把每种type类型都定义好了常量,放在types模块里,使用之前,需要先导入:
&&& import types
&&& type('abc')==types.StringType
&&& type(u'abc')==types.UnicodeType
&&& type([])==types.ListType
&&& type(str)==types.TypeType
最后注意到有一种类型就叫TypeType,所有类型本身的类型就是TypeType,比如:
&&& type(int)==type(str)==types.TypeType
使用isinstance()
对于class的继承关系来说,使用type()就很不方便。我们要判断class的类型,可以使用isinstance()函数。
我们回顾上次的例子,如果继承关系是:
代码如下:object -& Animal -& Dog -& Husky
那么,isinstance()就可以告诉我们,一个对象是否是某种类型。先创建3种类型的对象:
&&& a = Animal()
&&& d = Dog()
&&& h = Husky()
然后,判断:
&&& isinstance(h, Husky)
没有问题,因为h变量指向的就是Husky对象。
&&& isinstance(h, Dog)
h虽然自身是Husky类型,但由于Husky是从Dog继承下来的,所以,h也还是Dog类型。换句话说,isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。
因此,我们可以确信,h还是Animal类型:
&&& isinstance(h, Animal)
同理,实际类型是Dog的d也是Animal类型:
&&& isinstance(d, Dog) and isinstance(d, Animal)
但是,d不是Husky类型:
能用type()判断的基本类型也可以用isinstance()判断:
&&& isinstance('a', str)
&&& isinstance(u'a', unicode)
&&& isinstance('a', unicode)
并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是str或者unicode:
&&& isinstance('a', (str, unicode))
&&& isinstance(u'a', (str, unicode))
由于str和unicode都是从basestring继承下来的,所以,还可以把上面的代码简化为:
&&& isinstance(u'a', basestring)
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:
&&& dir('ABC')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:
&&& len('ABC')
&&& 'ABC'.__len__()
我们自己写的类,如果也想用len(myObj)的话,就自己写一个__len__()方法:
&&& class MyObject(object):
def __len__(self):
return 100
&&& obj = MyObject()
&&& len(obj)
剩下的都是普通属性或方法,比如lower()返回小写的字符串:
&&& 'ABC'.lower()
仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:
&&& class MyObject(object):
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
&&& obj = MyObject()
紧接着,可以测试该对象的属性:
&&& hasattr(obj, 'x') # 有属性'x'吗?
&&& hasattr(obj, 'y') # 有属性'y'吗?
&&& setattr(obj, 'y', 19) # 设置一个属性'y'
&&& hasattr(obj, 'y') # 有属性'y'吗?
&&& getattr(obj, 'y') # 获取属性'y'
&&& obj.y # 获取属性'y'
如果试图获取不存在的属性,会抛出AttributeError的错误:
可以传入一个default参数,如果属性不存在,就返回默认值:
&&& getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
也可以获得对象的方法:
&&& hasattr(obj, 'power') # 有属性'power'吗?
&&& getattr(obj, 'power') # 获取属性'power'
&bound method MyObject.power of &__main__.MyObject object at 0x108ca35d0&&
&&& fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
&&& fn # fn指向obj.power
&bound method MyObject.power of &__main__.MyObject object at 0x108ca35d0&&
&&& fn() # 调用fn()与调用obj.power()是一样的
通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。如果可以直接写:
sum = obj.x + obj.y
就不要写:
sum = getattr(obj, 'x') + getattr(obj, 'y')
一个正确的用法的例子如下:
def readImage(fp):
if hasattr(fp, 'read'):
return readData(fp)
return None
假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。
请注意,在Python这类动态语言中,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 python 访问内存地址 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信