变量
变量的概念
- 变量在第一次赋值时被创建
- 变量在表达式中被调用时会被替换为它的值
- 变量在表达式中被调用之前必须已经被赋值
- 变量应用对象,而且从不需要事先说明
变量从创建的流程
我们来解释一下变量创建的流程,使用 a = 3 来进行解释
1、创建一个对象来代表值3
2、如果内存中不存在变量 a 则进行创建
3、将变量与新的对象3进行连接
变量的命名规则
- 变量名只能有字母、数字、下划线组成,且不能以数字开头
- 变量名不能是 Python 的关键字,最好不要和 Python 内置的东西重复
- 变量名的选取尽量要有意义,要一看就明白该变量指代的内容
- 当有多个单词连接变量的时候要使用下划线进行连接
垃圾回收机制
先来看两行代码:
>>> a = 3
>>> a = "spam"
通过上面两行代码,可以引申出一个问题:我们先给变量a赋值了一个3,在给变量a赋值了一个字符串spam,那么我们之前给a赋值的3在我们又给a赋值了一个spam后发生了什么?
答案是,在Python中,每当一个变量名被赋予一个新的对象,如果原来的对象没有被其他的变量名或对象所引用的话,那么之前的对象所占用的内存空间就会被回收。
共享引用
>>> a = 3
>>> b = a
当我们运行赋值语句 b = a之后,变量b就成为对象3的一个引用,在内部,变量实际上时一个指针指向了对象的内存空间,该内存空间是通过运行字面量表达式3创建的。这种情况在Python中称为共享引用,即多个变量名引用了同一个对象;值得注意的是变量a和变量b此时没有彼此关联,真实情况是这两个变量通过它们的引用指向了同一个对象。
>>> a = 3
>>> b = a
>>> print(b)
3
>>> a = 4
>>> print(b)
3
通过上面的例子可以看出来,当我们将a的值进行改变的时候,b仍然不会改变;因为这时Python会重新划分一个内存空间链接到a,所以b并不会有什么影响。
关于列表的共享引用
>>> L1 = [1, 2, 3]
>>> L2 = L1
>>> print(L2)
[1, 2, 3]
>>> L1[0] = 0
>>> print(L2)
[0, 2, 3]
可以发现L2随着L1的变化而发生了变化,这是因为L2指向的是L1的整个列表,而并非某一个元素,所以会按照L1的变化而发生变化;如果要避免这中情况可以使用copy对象而不是使用引用;如:
>>> L1 = [1, 2, 3]
>>> L2 = L1[:]
>>> L1[0] = 0
>>> print(L2)
[1, 2, 3]
常量
常量中程序的整个生命周期内都不能发生变化,Pyhon没有内置的常量类型,但通常使用全大写的来指明该变量为常量,在程序中不应对其进行修改。
is运算符和==运算符
需要注意的是==运算符是测试两个被引用的对象是否具有相同的值;而is运算符是测试两个变量是否指向同一个内存地址。
>>> L01 = [1, 2, 3]
>>> L02 = [1, 2, 3]
>>> L01 == L02
True
>>> L01 is L02
False
网友评论