[笔记] Python 变量及其赋值
Last updated: 2019/12/31 Published at: 2019/12/31
Example-1
1a = 1
2b = 1
3a = a+1
- 首先将
a
赋值为1
,相当于让a
指向1
这个对象。
- 再将将
b
赋值为1
,即将 b 也指向1
这个对象。Python 中的对象可以被多个变量指向或引用。
- 最后执行
a = a + 1
。需要注意的是,Python 的数据类型,例如整型int
、字符串string
等,是不可变的。所以,a = a + 1
,并不是让a
的值增加1
,而是表示重新创建了一个新的值为2
的对象,并让a
指向它。但是b
仍然不变,仍然指向1
这个对象。
通过这个例子可以看到,这里的 a
和 b
,开始只是两个指向同一个对象的变量而已,也可以把它们想象成同一个对象的两个名字。简单的赋值 b = a
,并不表示重新创建了新对象,只是让同一个对象被多个变量指向或引用。同时,指向同一个对象,也并不意味着两个变量就被绑定到了一起。如果你给其中一个变量重新赋值,并不会影响其他变量的值。
Example-2
1l1 = [1, 2, 3]
2l2 = l1
3l1.append(4)
4l1
5[1, 2, 3, 4]
6l2
7[1, 2, 3, 4]
同样的,我们首先让列表 l1 和 l2 同时指向了 [1,2,3] 这个对象。
由于列表是可变的,所以 l1.append(4) 不会创建新的列表,只是在原列表的末尾插入了元素 4,变成 [1,2,3,4]。由于 l1 和 l2 同时指向这个列表,所以列表的变化会同时反映在 l1 和 l2 这两个变量上,那么,l1 和 l2 的值就同时变为了 [1,2,3,4]。
另外,Python 里的变量可以被删除,但是对象无法被删除。例如下面的代码:
1l = [1, 2, 3]
2del l
del l 删除了 l 这个变量,从此以后无法访问 l,但是对象 [1,2,3] 仍然存在。Python 程序运行时,其自带的垃圾回收系统会跟踪每个对象的引用。如果 [1,2,3] 除了 l 外,还在其他地方被引用,那就不会被回收,反之则会被回收。
综上,对于 Python 中的变量:
- 变量的赋值,只是表示让变量指向了某个对象,并不表示拷贝对象给变量;而一个对象,可以被多个变量所指向。
- 可变对象 (列表,字典,集合等等) 的改变,会影响所有指向该对象的变量。
- 对于不可变对象 (字符串,整型,元祖等等),所有指向该对象的变量的值总是一样的,也不会改变。但是通过某些操作 (+= 等等) 更新不可变对象的值时,会返回一个新的对象。
- 变量可以被删除,但是对象无法被删除。