Python不可变类型id和is statment
我以为下面的一切都是假的。有人能解释一下发生了什么事吗?不可变构造函数不创建新对象(和新ID)吗?元组如何具有相同的id并且是不同的对象Python不可变类型id和is statment,python,string,tuples,immutable.js,Python,String,Tuples,Immutable.js,我以为下面的一切都是假的。有人能解释一下发生了什么事吗?不可变构造函数不创建新对象(和新ID)吗?元组如何具有相同的id并且是不同的对象 print((1,) is (1,)) print(id(1,) == id(1,)) print('a' is 'a') print(id('a') == id('a')) 结果: False True True True 使用元组的每个实例构造不可变类型的新实例。元组的值不能更改,但它们是不同的(尽管相等)实例。您的第二行不正确。您正在将1传递给id。
print((1,) is (1,))
print(id(1,) == id(1,))
print('a' is 'a')
print(id('a') == id('a'))
结果:
False
True
True
True
使用元组的每个实例构造不可变类型的新实例。元组的值不能更改,但它们是不同的(尽管相等)实例。您的第二行不正确。您正在将
1
传递给id
。(Python允许在参数列表中使用尾随逗号。)
哪些是
False
False
True
True
因此,id
和的结果是匹配的
应该注意的是,is
/id
的结果可能因实现而异
例如,在CPython 2.7中,2*2是4
,但2*200不是400
。对于低整数值,CPython使用相同的内存地址(这是CPython中id
的结果)。同样,这因实现而异。您可能会看到在Python、Java和其他语言中使用不可变对象的结果
国家:
- 具有小值的短整数(通常介于-1和99之间
(包括在内)被“拘留”——每当结果有这样的值,
返回具有相同值的现有短int。这是
对于具有相同值的长整数,不执行此操作。这种差异
将继续存在。(由于本次实习没有保证,是吗
这是否是语义上的差异还有争议——但代码
可能存在使用“is”比较短整数和
由于这次实习,这类代码可能会失败
如果与长整数一起使用。)
示例:
>>> x=7
>>> y=10-3
>>> z=int('7')
>>> all(7 is e for e in [x,y,z])
True
>>> map(id, [x,y,z])
[140410571769784, 140410571769784, 140410571769784]
字符串:
>>> s1='abc'
>>> s2='abc'
>>> s1 is s2
True
>>> id(s1)
4378429560
>>> id(s2)
4378429560
不能依赖不可变对象的实例作为该对象的唯一标签。它是一个实现细节,可能因版本和实现而异
print((1,) is (1,))
print(id(1,) == id(1,))
print('a' is 'a')
print(id('a') == id('a'))
1-由于两个元组是不同的对象,因此第一个计算结果为false
2-它的计算结果为true,因为id(1,)
不将1,
识别为元组,而将其识别为1,并且当您有小整数或字符串时,python会进行优化,将两个名称引用到同一个id,这样就不必分配两个不同的空间。如果你有id((1,)
,那就错了,因为从那时起,它会将它识别为一个元组
3和4-它们是真的,原因与2是真的一样我一直在使用Python,我从来都不知道它允许参数列表中有一个尾随(而不是试用!)逗号。谢谢你!
print((1,) is (1,))
print(id(1,) == id(1,))
print('a' is 'a')
print(id('a') == id('a'))