Python中的标识、相等性与别名:深入理解对象引用机制

在Python编程中,理解变量如何引用对象以及对象之间的比较方式是至关重要的基础概念。本文将通过Lewis Carroll的笔名示例,深入探讨Python中的对象标识、相等性判断以及别名机制。

别名现象:变量共享同一对象

>>> charles = {'name': 'Charles L. Dodgson', 'born': 1832}
>>> lewis = charles  # 创建别名 
>>> lewis is charles  # 验证是同一对象 
True 
>>> id(charles), id(lewis)  # 内存地址相同
(4300473992, 4300473992)
>>> lewis['balance'] = 950  # 通过别名修改对象
>>> charles  # 原始变量也看到变化
{'name': 'Charles L. Dodgson', 'balance': 950, 'born': 1832}

在这个例子中,lewis和charles是同一字典对象的两个不同名称(别名)。它们不仅值相同,而且指向内存中的同一位置,因此:

  • is运算符返回True
  • id()函数返回相同的地址
  • 通过任一变量修改对象都会反映到另一变量上

值相等与标识不同的情况

>>> alex = {'name': 'Charles L. Dodgson', 'born': 1832, 'balance': 950}
>>> alex == charles  # 值比较 
True 
>>> alex is not charles  # 标识比较
True 

alex字典虽然内容与charles相同,但它们是独立的对象:

  • ==比较值(调用__eq__方法),返回True
  • is比较内存地址,返回False

对象三要素与比较机制

每个Python对象都有三个基本特征:

  • 标识(identity):对象在内存中的唯一地址,可用id()获取且永不改变
  • 类型(type):决定对象支持的操作,用type()获取
  • (value):对象包含的实际数据

比较操作的选择指南:

  • is比较标识(内存地址),速度更快且不可重载
  • ==比较值,可被__eq__方法重载,通常更关注业务逻辑
    特别提示:与None比较时,必须使用is或is not,这是Python社区的明确约定。

元组的"相对不可变性"

元组的不可变性仅保证其直接包含的引用不变,但若引用可变对象(如列表),这些对象的内容仍可修改:

>>> t1 = (1, 2, [30, 40])
>>> t2 = (1, 2, [30, 40])
>>> t1 == t2  # 初始相等 
True 
>>> t1[-1].append(99)  # 修改元组中的列表
>>> t1
(1, 2, [30, 40, 99])
>>> t1 == t2  # 不再相等
False

这种现象解释了:

  • 元组中列表的标识始终未变(id(t1[-1])不变)
  • 值比较结果因可变元素内容改变而变化
  • 这也是包含可变元素的元组不可散列的原因

实际应用建议

何时使用is:

  • 与None、True、False等单例值比较时
  • 需要严格判断是否为同一对象时

何时使用==:

  • 绝大多数业务场景下的值比较
  • 需要自定义比较逻辑时(通过重载__eq__)

性能考虑:

  • is比==更快(不涉及方法调用)
  • 对大型嵌套结构,值比较可能很昂贵

理解这些概念对于避免Python中的微妙bug至关重要,特别是在处理可变默认参数、浅拷贝/深拷贝等场景时。记住:Python中的变量是附加在对象上的标签(引用),而非存储数据的容器本身。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 闭包获取循环数据经典 bug

问题代码 def create_functions():functions []for i in range(3):# 创建一个函数,期望捕获当前循环的i值functions.append(lambda: print(f"My value is: {i}"))return functions# 创建三个函数 f0, f1, f2 create_functions()# 调用这些函数 f0() # 期望输出 &…

克里金模型+多目标优化+多属性决策!Kriging+NSGAII+熵权TOPSIS!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 克里金模型多目标优化多属性决策!KrigingNSGAII熵权TOPSIS!!matlab2023b语言运行! 1.克里金模型(Kriging Model)是一种基于空间统计学的插值方法…

Prompt Engineering 提示词工程学习

一、Prompt Engineering 简介 Prompt Engineering 是设计和优化输入提示(Prompt)以获得预期输出的过程。在与大型语言模型(如 GPT-4)交互时,如何构造提示会显著影响模型的回答质量。 二、Prompt 的重要性 提高生成准确性:通过正确的 Prompt 引导,模型能够更好地理解用…

MATLAB安装常见问题及解决方案详解(含代码示例)

MATLAB作为科学计算和工程分析的核心工具,其安装过程可能因操作系统版本、硬件配置或网络环境等因素而出现各种问题。本文基于MATLAB官方文档和社区经验,系统总结了安装过程中常见的问题,并提供详细的解决方案和代码示例,帮助用户…

免安装 + 快速响应Photoshop CS6 精简版低配置电脑修图

各位PS小白和修图大神们,今天来给大家聊聊Photoshop CS6精简版这个宝藏软件! Photoshop CS6精简版就是Adobe Photoshop CS6的“瘦身版”,它把一些不常用的功能给简化了,只留下核心工具,特别适合那些想高效操作、节省系…

微服务架构实战:从服务拆分到RestTemplate远程调用

微服务架构实战:从服务拆分到RestTemplate远程调用 一 . 服务拆分1.1 服务拆分注意事项1.2 导入服务拆分 Demo1.3 小结 二 . 服务间调用2.1 注册 RestTemplate2.2 实现远程调用2.3 小结 三 . 提供方和消费方 在分布式系统设计中,微服务架构因其灵活性、可…

MySQL 索引与事务详解

目录 一、索引(Index) 二、事务(Transaction) 三、总结 一、索引(Index) 索引的本质:一种数据结构(如 BTree、Hash),用于快速定位数据,避免全…

macOS Python 环境配置指南

1. 检查现有 Python 环境 python3 --version # 检查 Python 3 版本 pip3 --version # 检查 pip 版本 2. 安装 pyenv(Python 版本管理工具) # 使用 Homebrew 安装 pyenvbrew install pyenv# 配置 pyenv 环境变量(添加到 ~/.zshrc&#…

游戏引擎学习第272天:显式移动转换

回顾并为今天的内容铺垫背景 我们刚开始为游戏主角编写一些程序逻辑,因为我们之前已经完成了大部分引擎方面的开发,现在可以专注在角色身上。这个角色的移动方式会有些特别,与大多数游戏角色的运动机制不太一样。我们当前正在实现的控制方式…

软件测试都有什么???

文章目录 一、白盒测试(结构测试)二、黑盒测试(功能测试)三、灰盒测试四、其他测试类型五、覆盖准则对比六、应用场景 软件测试主要根据测试目标、技术手段和覆盖准则进行分类。分为白盒测试、黑盒测试、灰盒测试及其他补充类型 一…

very_easy_sql(SSRF+SQL注入)

题目有一行提示: you are not an inner user, so we can not let you have identify~(你不是内部用户,所以我们不能让你进行身份验证)联想到可能存在SSRF漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内…

国内外主流AI编程工具全方位对比分析(截至2025年5月)

一、国际主流工具对比 1. Windsurf(Codeium公司) 核心功能:代理型AI编程(代码导航/修改/命令执行)、浏览器DOM访问、网页研究功能语言支持:70语言,包括Python/Java/JavaScript/Rust等[[22-23]…

ARP协议的工作原理

文章目录 ARP协议的工作原理ARP报文(以太网)ARP高速缓存 ARP协议的工作原理 ARP协议的作用是实现任意网络层地址到任意物理地址转换。工作原理是: 主机向自己所在网络广播一个ARP请求,该请求包含目标机器的网络地址。处于该网络…

【小知识酷】《Matlab》考点精简

在线编译器 https://matlab.mathworks.com/?elqsidumic49viv8wu5r6fckew 第1章 matlab基础知识 第1节 输出函数 1. 使用disp函数 disp函数可用于输出变量的值或者字符串。 % 输出字符串 disp(Hello, MATLAB!); %显示Hello, MATLAB!% 输出变量 x 10; disp(x); %显示10% 输出数…

码蹄集——中庸之道(三个数比较)

MT1112 中庸之道 请编写一个简单程序,输入3个整数,比较他们的大小,输出中间的那个数 格式 输入格式: 输入整型,空格分隔 输出格式:输出整型 样例 1 输入:1 5 3 输出:3 比较…

快速搭建一个vue前端工程

一、环境准备 1、安装node.js 下载地址:Node.js 推荐版本如下: 2、检查node.js版本 node -v npm -v 二、安装Vue脚手架 Vue脚手架是Vue官方提供的标准化开发工具。vue官网:https://cn.vuejs.org/ 全局安装vue/cli (仅第一次…

React Native基础环境配置

React Native基础环境配置 1.引言2.React-Native简介3.项目基础环境搭建1.引言 感觉自己掌握的知识面还是有点太窄了,于是决定看看移动端的框架,搞个react搭一个后端管理项目,然后拿react-native写个小的软件,试着找个三方上架一下应用市场玩玩。毕竟不可能一直在简历上挂一…

PHP和Composer 安装

Composer 是 PHP 的 依赖管理工具,就像: Node.js 用 npm Python 用 pip Java 用 maven 用来安装和管理 PHP 项目中需要用到的第三方库 安装PHP可以理解成 Java解释器 安装PHP PHP For Windows: Binaries and sources Releaseshttps://windows.php.n…

API请求参数有哪些?

通用参数 app_key:应用的唯一标识,用于验证应用身份,调用API时必须提供。 timestamp:请求时间戳,通常为当前时间的毫秒级时间戳,用于防止请求被重放攻击。 format:返回数据的格式,…

并发笔记-条件变量(三)

文章目录 背景与动机30.1 条件变量的定义与基本操作 (Definition and Routines)30.2 生产者/消费者问题 (Bounded Buffer Problem)30.3 覆盖条件 (Covering Conditions) 与 pthread_cond_broadcast30.4 总结 背景与动机 到目前为止,我们已经学习了锁 (Locks) 作为并…