You*_*mon 2 python reference variable-assignment
分配:
>>> a = ['spam']
>>> b = ['spam']
>>> a is b
False
Run Code Online (Sandbox Code Playgroud)
参考:
>>> c = ['spam']
>>> d = c
>>> c is d
True
Run Code Online (Sandbox Code Playgroud)
False?True?您的第一个代码段创建了两个唯一的列表对象,这些对象不同.因此,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
Run Code Online (Sandbox Code Playgroud)
这是由于字符串实习,这发生在CPython中(即它是特定于实现的).因此,如果相同的字符串文字显示在两个不同的位置,则相同的字符串对象将用于两者(具有限制).
这在"Python string interning"中有更详细的解释.
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |