Python可变对象中的引用与赋值

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)
  1. 以上两者有什么区别?
  2. 为何分配结果False
  3. 为何参考结果True

ars*_*jii 9

您的第一个代码段创建了两个唯一的列表对象,这些对象不同.因此,a is b返回假的,因为ab都指向不同的对象:

          +------+
a ------> | list |
          +------+

          +------+
b ------> | list |
          +------+

您的第二个代码段创建一个列表对象,并指向该对象cd该对象,因此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"中有更详细的解释.