Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么a=1,b=1,id(a)==id(b),但a=1.0,b=1.0,id(a)!=python中的id(b)?_Python - Fatal编程技术网

为什么a=1,b=1,id(a)==id(b),但a=1.0,b=1.0,id(a)!=python中的id(b)?

为什么a=1,b=1,id(a)==id(b),但a=1.0,b=1.0,id(a)!=python中的id(b)?,python,Python,为什么a和b是十进制id(a)!=python中的id(b)? 当number为decimal时,python将创建两个对象?为什么id(1)==id(1)的唯一原因是缓存低整数以提高性能。尝试id(1000)=id(1000) 事实上,有时候这是可行的。更好的测试在不同的语句中分配内容: a = 1 b = 1 id(a) == id(b) a = 1.0 b = 1.0 id(a) != id(b) 在更多情况下,字符串也可能发生同样的情况: >>> x = 1 >

为什么a和b是十进制id(a)!=python中的id(b)?

当number为decimal时,python将创建两个对象?

为什么
id(1)==id(1)
的唯一原因是缓存低整数以提高性能。尝试
id(1000)=id(1000)

事实上,有时候这是可行的。更好的测试在不同的语句中分配内容:

a = 1
b = 1
id(a) == id(b)
a = 1.0
b = 1.0
id(a) != id(b)
在更多情况下,字符串也可能发生同样的情况:

>>> x = 1
>>> y = 1
>>> id(x) == id(y)
True
>>> x = 1000
>>> y = 1000
>>> id(x) == id(y)
False
>>> 
>>> id(1000) == id(1000)
True
底线是,使用
is
(或比较
id()
值,这本质上是相同的,但速度较慢)来确定两个对象是否相同,这在某些情况下只是一个好策略,因为Python将缓存对象以提高性能

一条硬性规定是,两个不同的可变对象将具有不同的
id
值,但正如下面的评论员所指出的,对于是否会创建多个相同值的不可变对象,没有任何保证

使用文字值时,解释器更容易缓存内容。如果您让它计算东西,那么您可以看到哪些东西是它很难缓存的,而哪些东西是它偶然缓存的,因为它在附近注意到它们:

>>> x = 'abcdefg'
>>> y = 'abcdefg'
>>> x is y
True

id(1)==id(1)
的唯一原因是缓存低整数以提高性能。尝试
id(1000)=id(1000)

事实上,有时候这是可行的。更好的测试在不同的语句中分配内容:

a = 1
b = 1
id(a) == id(b)
a = 1.0
b = 1.0
id(a) != id(b)
在更多情况下,字符串也可能发生同样的情况:

>>> x = 1
>>> y = 1
>>> id(x) == id(y)
True
>>> x = 1000
>>> y = 1000
>>> id(x) == id(y)
False
>>> 
>>> id(1000) == id(1000)
True
底线是,使用
is
(或比较
id()
值,这本质上是相同的,但速度较慢)来确定两个对象是否相同,这在某些情况下只是一个好策略,因为Python将缓存对象以提高性能

一条硬性规定是,两个不同的可变对象将具有不同的
id
值,但正如下面的评论员所指出的,对于是否会创建多个相同值的不可变对象,没有任何保证

使用文字值时,解释器更容易缓存内容。如果您让它计算东西,那么您可以看到哪些东西是它很难缓存的,而哪些东西是它偶然缓存的,因为它在附近注意到它们:

>>> x = 'abcdefg'
>>> y = 'abcdefg'
>>> x is y
True

相关(不完全是dup):相关(不完全是dup):与Java中的
Integer.valueOf(1)
的想法相同。是的,但a=1000,b=1000,id(a)==id(b)为False。当我在shell中运行“id(1000)==id(1000)”时,它总是正确的。@Pegasus。无论哪种方式,确切的行为都很可能依赖于实现,而不是语言规范的强制要求。作为程序员,您不能依赖于在此处获取相同(或不同)的对象实例。因此,
id(1.0)==id(1.0)
也是如此。例如,
id(1000)==id(1000)
在IronPython2.9.0.0中为我返回False-,这很好,因为从来没有人承诺过不这样做。请注意,在许多实现中(但显然不是铁杆式的!)由同一语句中的文字生成的对象可以重用。与Java中的
Integer.valueOf(1)
相同。是的,但a=1000,b=1000,id(a)==id(b)为False。当我在shell中运行“id(1000)==id(1000)”时,它总是正确的。@Pegasus。无论哪种方式,确切的行为都很可能依赖于实现,而不是语言规范的强制要求。作为程序员,您不能依赖于在此处获取相同(或不同)的对象实例。因此,
id(1.0)==id(1.0)
也是如此。例如,
id(1000)==id(1000)
在IronPython2.9.0.0中为我返回False-,这很好,因为从来没有人承诺过不这样做。请注意,在许多实现中(但显然不是ironpy!)由同一语句中的文字生成的对象可以重用。