ad

《Python编程从0到1 视频教学版》_深入Python设计的本质_1.4.5 左值、赋值和引用

admin 163 2023-10-19

【摘要】 本书摘自《Python编程从0到1 视频教学版》一书中第1章,第4节,作者是张頔。

1.4.5 左值、赋值和引用

初学者可以选择性跳过本节的内容。①

仅凭字面值(如100)或由字面值组成的表达式(如100+200)无法得到有价值的程 序。 机器之魅力在于状态的运转和变化。 在前文的欧几里得算法程序中, a 、b 这一对“变 量"不断地被赋予新的计算结果直至计算终点的过程就是例子,凡是程序大都如此。 这就 需要为状态或数据开辟存储空间,并进行赋值以设定某种访问标记。

术语“左值” (Ivalue), 表示用来标记对象存储位置的语言要素 (location value)。

表达式100+200的计算结果为300,但无处安放。仅由这样的孤立表达式构成语句, 计算结果会被丢弃。而包含了赋值操作的语句a=100+200 则不同,等号右边的计算结果 300将被存储于某一 内存地址后关联等号左边的名字 a, 后者则代表了该存储位置。在此 场景中, a 是左值,而100+200不是。

在另一语句L[0]=a 中,程序员实际上关心a 代表的值(即300)而非存储位置,关 心 L[0]的位置而非值。这行代码的意图是L[0]所存储的引用修改为指向300,而不关心其 本来指向哪里。故而在此场景中L[0]是左值, a 不是。上述诸场景中,等号右边的计算结 果被称为“表达式的值”,有时也被称为“右值”。

《Python编程从0到1 视频教学版》_深入Python设计的本质_1.4.5 左值、赋值和引用

a,L[0]既可以作为表达式,也可以作为左值。200、200+300和a+200 则只能作为表达式。

左值最容易被注意的特性是“出现在赋值运算符左边”,所以得中文名"左值”。但 事实上应用左值的上下文不仅仅是赋值。读者在1.4.6节将看到对左值的del操作,在1.5.4 节将看到左值列表用作 for的循环变量。

1. 左值的引用特性

在 Python 中左值是“引用” (reference), 而非对象本身。 “引用”是用来找到对象的标签,在Python 的典型实现CPython 中以对象的内存地址作为引用。在64位计算机 系统上地址占8个字节,所以如下的赋值操作创建了如图1.8所示的内存图景。

① 本节对精确理解 Python 的行为至关重要,但对初学者而言较为晦涩。如果读者已经掌握其他的编程语言,则应当仔细阅 读本节内容。但如果 Python 是读者的第一门语言,则可以先粗略浏览本节内容,遇到不理解之处跳过即可。在完成本章 其余部分的学习后再重读本节内容。

② “赋值”一词的英文是assignment, 为“委派、指定”之意。故语句a=10 的含义为“委派名字a 指代字面值10”。当然 不必每次都用如此烦琐、拗口的文字来交流,在此之后本书也将使用简单词语来描述赋值行为。但在此处必须建立清晰的 概念,因为赋值操作相关联的模型决定了语言的思维方式。

③ 请注意,在Python中赋值不是运算符,赋值语句也不是表达式。

④ 实际上Python 语言手册规定[40]:每个对象都有其身份标识 (id/identity), … … 对象的身份标识一旦创建就不再更改。 is操作符用于比较两个对象的身份标识。 id函数用来返回代表身份标识的整数。 CPython的实现细节则是以对象的内存地 址作为id 函数的返回值。

虽然严谨的术语将这种性质的左值(名词)或指向行为(动词)称为“引用”,但习 惯上还有以下提法(以名字a 为 例 ) :

· 当 称a 为“变量”时,强调a 指向内容不确定或可变的事实;

· 当 提 及“a 的值”时,所指的是a 指向对象的值;

● 当提及“引用a” 时,往往强调的是a 所指向的对象;

· 当 提 及 " 对a 赋值"时,往往指让a 指向另外的对象;

· 有 时 由 于C 语言习惯或强调名词属性时,也称a 为“指针” (pointer)。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Python编程从0到1 视频教学版》_深入Python设计的本质_1.6.7 格式化字符串
下一篇:《Excel财务日常数据与实例讲解》_从理论到实践的一大步_1.1.1 常用的链接引用函数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×