Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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
Python不可变类型id和is statment_Python_String_Tuples_Immutable.js - Fatal编程技术网

Python不可变类型id和is statment

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。

我以为下面的一切都是假的。有人能解释一下发生了什么事吗?不可变构造函数不创建新对象(和新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
。(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'))