先把两个问题分开
== 通常询问值是否相等,is 询问两边是否指向同一对象。对内置列表来说,元素相等可以使列表值相等,但列表仍是分别创建的对象。若把 is 当成通用的值比较,程序可能在小型例子中碰巧工作,在输入变化后出现难以理解的错误。
原创例题:三个名字、两个列表
依次执行 a=[1,2]、b=[1,2]、c=a。此时 a==b 为 True,a is b 为 False,而 a is c 为 True。再执行 a.append(3),c 也会显示 [1,2,3],b 仍为 [1,2]。变化的原因是 a 与 c 共享同一个列表,并非所有相等的列表都会一起变化。
画出名字指向对象的箭头,可以同时解释比较与修改结果。不要依赖小整数或字符串在某次运行中是否共享对象来总结规则;实现层面的复用不应成为业务判断条件。
None 检查与自定义相等
判断一个结果是否为 None 时,常用 result is None。它直接检查这个特殊单例。自定义类可以定义自己的相等行为,因此课程进入面向对象部分后,还要分清运算符调用的行为与对象身份;本例只使用内置列表,不假定所有对象比较都与列表一样。
先预测,再执行,再说明
独立建立 d=list(a),判断它与 a 的值和身份关系;再修改 d 的第一项,说明 a 是否改变。记录每次判断所依据的是对象箭头还是元素内容。能解释这两层关系,才算掌握了错误原因,而不只是记住 True 和 False。
参考资料
下一步
需要中文大学课程辅导,可向阿尔比恩启航学院说明课程名称、卡住的步骤、已有尝试和学习目标。预约前确认学科适配、导师时间、费用及院校允许的帮助范围。例题用于独立练习,正式计分成果由学生本人完成。
