当前位置: 首页 > news >正文

Python 对象引用、可变性和垃圾 回收(变量不是盒子)

变量不是盒子

1997 年夏天,我在 MIT 学了一门 Java 课程。Lynn Andrea Stein 教授
(一位获奖的计算机科学教育工作者,目前在欧林工程学院教书)指
出,人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对
象语言中的引用式变量。Python 变量类似于 Java 中的引用式变量,因此
最好把它们理解为附加在对象上的标注。

在示例 8-1 所示的交互式控制台中,无法使用“变量是盒子”做解释。图
8-1 说明了在 Python 中为什么不能使用盒子比喻,而便利贴则指出了变
量的正确工作方式。

示例 8-1 变量 a 和 b 引用同一个列表,而不是那个列表的副本

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]

image
图 8-1:如果把变量想象为盒子,那么无法解释 Python 中的赋值;
应该把变量视作便利贴,这样示例 8-1 中的行为就好解释了

Stein 教授还反复讲解了赋值方式。例如讲到 seesaw 对象时,她会说“把
变量 s 分配给 seesaw”,绝不会说“把 seesaw 分配给变量 s”。对引用式
变量来说,说把变量分配给对象更合理,反过来说就有问题。毕竟,对
象在赋值之前就创建了。示例 8-2 证明赋值语句的右边先执行。

示例 8-2 创建对象之后才会把变量分配给对象

>>> class Gizmo:
... def __init__(self):
... print('Gizmo id: %d' % id(self))
...
>>> x = Gizmo()
Gizmo id: 4301489152>>> y = Gizmo() * 10 ➋
Gizmo id: 4301489432 ➌
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'Gizmo' and 'int'
>>>
>>> dir()['Gizmo', '__builtins__', '__doc__', '__loader__', '__name__',
'__package__', '__spec__', 'x']

❶ 输出的 Gizmo id: … 是创建 Gizmo 实例的副作用。
❷ 在乘法运算中使用 Gizmo 实例会抛出异常。
❸ 这里表明,在尝试求积之前其实会创建一个新的 Gizmo 实例。
❹ 但是,肯定不会创建变量 y,因为在对赋值语句的右边进行求值时抛
出了异常。


为了理解 Python 中的赋值语句,应该始终先读右边。对象在
右边创建或获取,在此之后左边的变量才会绑定到对象上,这就像
为对象贴上标注。忘掉盒子吧!

相关文章:

  • Java游戏服务器开发流水账(4)游戏的数据持久化
  • 【Langchain】根据LCEL规范实现Runable interface
  • 精品,第22章 Python3 数据类型与文件操作详解
  • Kubernetes资源管理之Request与Limit配置黄金法则
  • 科大讯飞TTS(文字转语音)和STT(语音转文字)
  • ragflow报错:KeyError: ‘\n “序号“‘
  • VTK-B 人工智能采集单元选型与配置原理说明
  • printf调试时候正常,运行时打印不出来
  • LAMMPS分子动力学基于周期扰动法的黏度计算
  • 【Bluedroid】蓝牙 HID 设备服务注册流程源码解析:从初始化到 SDP 记录构建
  • 旅游推荐数据分析可视化系统算法
  • 求两个正整数的最大公约数和最小公倍数:方法1:辗转相除法
  • openstack的网络和vpc网络底层原理有什么区别与联系
  • 添加物体.
  • MySQL 从入门到精通(五):索引深度解析 —— 性能优化的核心武器
  • 计算机网络 4-1 网络层(网络层的功能)
  • openstack的网络技术是怎样的
  • JAVA练习题(1) 卖飞机票
  • AJAX 请求方式
  • 【沉浸式求职学习day35】【Tomcat安装、配置】【Http简述】
  • 冷冰川谈黑白
  • 巴基斯坦全面恢复领空开放
  • 罕见沙尘再度入川,官方:沙尘传输高度达到平流层,远超以往
  • 青年与人工智能共未来,上海创新创业青年50人论坛徐汇分论坛举办
  • 国博馆刊|北朝至唐初夏州酋豪李氏家族的发展与身份记忆
  • 金融监管局:已设立74支私募股权投资基金,支持投资科技创新企业