首页 > 试题广场 >

已知a = [1, 2, 3]和b = [1, 2, 4],

[单选题]
已知a = [1, 2, 3]和b = [1, 2, 4],那么id(a[1])==id(b[1])的执行结果 ()
  • True
  • False
python中对于小整数对象有一个小整数对象池,范围在[-5,257)之间。对于在这个范围内的征数,不会新建对象,直接从小整数对象池中取就行。
发表于 2019-07-07 10:37:58 回复(10)
id(object)是python的一个函数用于返回object的内存地址。但值得注意的是,python 为了提高内存利用效率会对一些简单的对象(如数值较小的int型对象,字符串等)采用重用对象内存的办法。
发表于 2019-05-22 20:49:45 回复(2)
print(id(a[1]) ==id (b[1])) True
print((a[1]) is (b[1])) True
1、is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
2、== 比较的是两个对象的内容是否相等,值是否相等
python3.6中对于小整数对象有一个小整数对象池,范围不止在[-5,257)之间。我试了百万以上的数地址都是相同的
发表于 2019-10-09 10:50:37 回复(4)
为了提高内存利用效率对于一些简单的对象,如一些数值较小的int象,字符串对象等python采取重用对象内存的办法.
发表于 2019-03-15 11:10:42 回复(0)
对于两个列表来说,其内存地址不一样,即使值一样;
但对于列表中的值来说,由于是不可变类型,因此会指向同一个内存地址

发表于 2020-04-13 23:18:06 回复(2)
id返回对象的内存地址,python对于小的整型数据和简单的字符串数据会建立数据池,调用这些数据时会直接从数据池中选择,即对于这些数据,相同这内存不变
发表于 2019-09-26 22:52:19 回复(0)

楼上几位说的是对的,在-5到257之间,不包括257,所以是半开半闭区间,[-5,257)
图片说明

发表于 2019-11-14 16:51:40 回复(5)
python中 -5~256 视为小整数所以地址引用。
在 python源代码:Objectc/longobject.c中,40行左右,有个变量 small_ints ,保存小整数, 也就是小整数对象池的大小,可以修改这个源码编译,自己控制小整数对象池。
static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; 
// NSMALLNEGINTS 是 5 // NSMALLPOSINTS 是 257
发表于 2019-10-20 14:19:02 回复(0)

小整数对象池

[-5,257)

发表于 2019-12-01 19:57:10 回复(0)

看了很多回答发现了些矛盾和不够全面的地方

首先来看看下面些代码

  1. 在终端python交互模式下运行
    # 一句一句解释执行
    >>> a = -6 
    >>> b = -6
    >>> print(a is b, a == b)
    False True
  2. 在终端中用命令运行整个py文件
    # test.py 文件内容如下
    a = -6
    b = -6
    print(a is b, a == b)
    # 运行结果如下
    PS F:\CS_Practice\python\2023> python .\test.py
    True True
  3. 在pycharm、vscode等ide中执行
    # 代码
    a = -6
    b = -6
    print(a is b, a == b)
    # 运行结果
    C:\Users\xtzz\AppData\Local\Programs\Python\Python310\python.exe F:\CS_Practice\python\2023\test.py 
    True True

分析

情况 1 如其他答主所说的 python 有个 [-5, 257) 的小整数内存池,会复用对象所以同个值内存地址相同。a 和 b 的值是 -6,不在范围内所以用 is 比较为 False,也就是 id(a) 不等于 id(b)。
而在 ide 或者直接 python 命令运行整个文件,同样的代码得出的结果却是 a is b为 True。进一步发现,在 2、3 这样的情况不可变对象(数字、字符串和元组等)相同的值地址就相同。

最后我怀着疑问找到了比较合理的答案

《源码探秘 CPython》12. 小整数对象池

发表于 2023-04-11 14:18:40 回复(0)
python中对于小整数对象有一个小整数对象池,范围在【-5,257】之间。对于在这个范围内的整数,不会新建对象,直接从小整数对象池中取就行
发表于 2020-03-10 10:31:44 回复(0)
虽然看不懂,但感觉应该是true。
发表于 2019-08-29 13:06:21 回复(0)
求解:为啥第二行输出的是false
编辑于 2023-12-23 17:28:12 回复(0)
a[1] = 2
b[1] = 2
指向同一个对象,内存地址相同
发表于 2021-09-04 13:54:58 回复(0)
数值相同,内存地址相同。
发表于 2020-01-13 13:04:00 回复(0)
id(object)是python的一个函数用于返回object的内存地址。但值得注意的是,python 为了提高内存利用效率会对一些简单的对象(如数值较小的int型对象,字符串等)采用重用对象内存的办法。
发表于 2020-11-09 00:14:52 回复(0)
比较炸裂的测试
>>> id([1,2,4]) == id([-124,2,5,4324,32421])
True
发表于 2023-11-15 15:08:48 回复(0)
id()返回对象的地址,在python中会给小的整数型建立小正数对象池[-5,257),在其中的小整数,会返回对象池中的地址。所以在两个列表中的id是一致的
发表于 2023-09-03 09:59:19 回复(0)
这个属于代码块的缓存问题,在不同代码块中的从-5~255的整型、bool、以及满足条件的字符串,都会被缓存下来。
发表于 2023-08-11 17:35:38 回复(0)
对于一些数值较小的int对象,python采用重用内存的办法。==比较的是两个对象内容的值是否相等,is是地址和值
发表于 2023-07-14 20:28:37 回复(0)