a=[1234,1234] #list
a
[1234, 1234]
id(a[0])
38032480
id(a[1])
38032480
b=1234 #b is a variable of integer type
id(b)
38032384
为什么在 Python 中,id(b) 与 id(a[0]) 和 id(a[1]) 不同呢?涉及 IT 技术相关内容。
a=[1234,1234] #list
a
[1234, 1234]
id(a[0])
38032480
id(a[1])
38032480
b=1234 #b is a variable of integer type
id(b)
38032384
dis
模块检查编译结果:>>> dis.dis('a = [1234, 1234, 5678, 90123, 5678, 4321]')
1 0 LOAD_CONST 0 (1234)
2 LOAD_CONST 0 (1234)
4 LOAD_CONST 1 (5678)
6 LOAD_CONST 2 (90123)
8 LOAD_CONST 1 (5678)
10 LOAD_CONST 3 (4321)
12 BUILD_LIST 6
14 STORE_NAME 0 (a)
16 LOAD_CONST 4 (None)
18 RETURN_VALUE
LOAD_CONST 0
",而所有的5678都加载了"LOAD_CONST 1
"。它们指的是与代码对象相关联的常量表。在这里,该表为(1234, 5678, 90123, 4321, None)
。a[0]
和a[1]
确实指向同一个对象:该行代码的代码对象的常量表中的相同常量。b = 1234
时,这将再次被编译和执行,与之前的行无关,因此将分配一个不同的对象。*.py
文件时,每个函数都会被编译成单独的代码对象,因此当我们运行以下命令时:a = [1234, 1234]
b = 1234
print(id(a[0]), id(a[1]))
print(id(b))
a = (lambda: [1234, 1234])()
b = (lambda: 1234)()
print(id(a[0]), id(a[1]))
print(id(b))
4415536880 4415536880
4415536880
4415536912 4415536912
4415537104
19745 19745
19745
19745 19745
19745
list
构造函数有关,而不是int
构造函数?(不想聪明地回答;只是好奇)无论如何+1!感谢您的回答。 - hiro protagonista.append(1234)
,然后执行id(a[2])
,你可能会得到相同的id,也可能不会。正如@hiro protagonist所指出的那样,这些只是你不应该依赖的内部优化。int
只是一个与架构相关的字节数,因此对于int x = 1
,表达式*x
指向这些字节。在Python中,所有东西都是对象,包括数字。这就是为什么id(1)
引用了一个描述数字1
的int
类型对象。您可以调用它的方法:(1).__str__()
将返回一个字符串'1'
。x = [1, 2, 3]
时,id(x)
是指向具有三个元素的list
对象的"指针"。list
对象本身相当复杂。但是x[0]
不是组成整数值1的字节;它在内部是对数字1的int
对象的引用。因此,id(x[0])
是指向该对象的"指针"。由于没有必要有两个表示同一个数字1的对象,id(1)
在 Python 解释器运行期间始终相同。下面是一幅图示:
x = [1, 2, 3]
y = [1, 100, 1000]
assert id(x) != id(y) # obviously
assert id(x[0]) == id(y[0]) == id(1) # yes, the same int object
id()
值(请参见此处)。案例1:
Type "help", "copyright", "credits" or "license" for more information.
>>> a=[1234,1234]
>>> id(a[0])
52687424
>>> id(a[1])
52687424
案例2(请注意,在该案例结束时,a [0]和a [1]具有相同的值但不同的标识符):
Type "help", "copyright", "credits" or "license" for more information.
>>> a=[1,1234]
>>> id(1)
1776174736
>>> id(1234)
14611088
>>> id(a[0])
1776174736
>>> id(a[1])
14611008
>>> a[0]=1234
>>> id(1234)
14611104
>>> id(a[0])
14611152
>>> id(a[1])
14611008
>>>
int
构造函数在进行内部化,而不是list
。 - kennytmid
相同,你的变量指向同一“内存位置”,如果id
不同,则不是。 - hiro protagonist