配套视频教程
变量引用
人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量。Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加在对象上的标注或便签。
在示例中所示的交互式控制台中,无法使用“变量是盒子”做解释。示意图说明了在 Python 中为什么不能使用盒子比喻,而便签则指出了变量的正确工作方式。
示例 变量
a
和b
引用同一个列表,而不是那个列表的副本
>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]
如果把变量想象为盒子,那么无法解释 Python 中的赋值;应该把变量视作便利贴,这样示例中的行为就好解释了
刚刚我们说明了两个变量引用同一个数据的情况,再看一种情况:一个变量先后引用不同的数据
- 定义一个整数变量
a
,并且赋值为1
代码 | 图示 |
---|---|
a = 1 | |
- 将变量
a
赋值为2
代码 | 图示 |
---|---|
a = 2 | |
- 定义一个整数变量
b
,并且将变量a
的值赋值给b
代码 | 图示 |
---|---|
b = a | |
变量
b
是第 2 个贴在数字2
上的标签
如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用
- 变量 不再 对之前的数据引用
- 变量 改为 对新赋值的数据引用
再看一看字典的例子:
>>> 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}
>>> alex = {'name': 'Charles L. Dodgson', 'born': 1832, 'balance': 950}
>>> alex == charles
True
>>> alex is not charles
True
charles 和 lewis 绑定同一个对象,alex 绑定另一个具有相同内容的对象