分配:
>>> a = ['spam'] >>> b = ['spam'] >>> a is b False
参考:
>>> c = ['spam'] >>> d = c >>> c is d True
以上两者有什么区别?
为何分配结果False
?
为何参考结果True
?
arshajii.. 9
您的第一个代码段创建了两个唯一的列表对象,这些对象不同.因此,a is b
返回假的,因为a
并b
都指向不同的对象:
+------+ a ------> | list | +------+ +------+ b ------> | list | +------+
您的第二个代码段创建一个列表对象,并指向该对象c
和d
该对象,因此c is d
返回true:
+------+ c ------> | list | <------ d +------+
请注意以下内容,来自http://docs.python.org/3/reference/datamodel.html:
每个对象都有一个标识,一个类型和一个值.对象的标识一旦创建就永远不会改变; 您可能会将其视为内存中对象的地址.所述
is
操作者比较两个对象的身份; 该id()
函数返回一个表示其身份的整数.
所以is
并且==
非常不同; 前者比较对象标识,后者比较对象值.实际上,==
您的片段中的测试将返回true.
鉴于上面的解释,这个故事与字符串略有不同可能会让人感到惊讶:
>>> a = 'str' >>> b = 'str' >>> >>> a is b True
这是由于字符串实习,这发生在CPython中(即它是特定于实现的).因此,如果相同的字符串文字显示在两个不同的位置,则相同的字符串对象将用于两者(具有限制).
这在"Python string interning"中有更详细的解释.
您的第一个代码段创建了两个唯一的列表对象,这些对象不同.因此,a is b
返回假的,因为a
并b
都指向不同的对象:
+------+ a ------> | list | +------+ +------+ b ------> | list | +------+
您的第二个代码段创建一个列表对象,并指向该对象c
和d
该对象,因此c is d
返回true:
+------+ c ------> | list | <------ d +------+
请注意以下内容,来自http://docs.python.org/3/reference/datamodel.html:
每个对象都有一个标识,一个类型和一个值.对象的标识一旦创建就永远不会改变; 您可能会将其视为内存中对象的地址.所述
is
操作者比较两个对象的身份; 该id()
函数返回一个表示其身份的整数.
所以is
并且==
非常不同; 前者比较对象标识,后者比较对象值.实际上,==
您的片段中的测试将返回true.
鉴于上面的解释,这个故事与字符串略有不同可能会让人感到惊讶:
>>> a = 'str' >>> b = 'str' >>> >>> a is b True
这是由于字符串实习,这发生在CPython中(即它是特定于实现的).因此,如果相同的字符串文字显示在两个不同的位置,则相同的字符串对象将用于两者(具有限制).
这在"Python string interning"中有更详细的解释.