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

 手浪用户2602916293 发布于 2023-02-03 11:32

分配:

>>> a = ['spam']
>>> b = ['spam']
>>> a is b
False

参考:

>>> c = ['spam']
>>> d = c
>>> c is d
True

    以上两者有什么区别?

    为何分配结果False

    为何参考结果True

arshajii.. 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

这是由于字符串实习,这发生在CPython中(即它是特定于实现的).因此,如果相同的字符串文字显示在两个不同的位置,则相同的字符串对象将用于两者(具有限制).

这在"Python string interning"中有更详细的解释.

1 个回答
  • 您的第一个代码段创建了两个唯一的列表对象,这些对象不同.因此,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
    

    这是由于字符串实习,这发生在CPython中(即它是特定于实现的).因此,如果相同的字符串文字显示在两个不同的位置,则相同的字符串对象将用于两者(具有限制).

    这在"Python string interning"中有更详细的解释.

    2023-02-03 11:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有