1.Python中的变量
1.1 变量定义
- 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建
- 等号(=)用来给变量赋值
-
=
左边是一个变量名 -
=
右边是存储在变量中的值
变量名 = 值
变量定义之后,后续就可以直接使用了
在定义变量时不需要指定变量的类型, 解释器会自动根据赋值语句右边值的类型给变量指定类型。
1.2 变量的引用
- 变量 和 数据 都是保存在 内存 中的
- 在
Python
中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的
在 Python
中
- 变量 和 数据 是分开存储的
- 数据 保存在内存中的一个位置
- 变量 中保存着数据在内存中的地址
- 变量 中 记录数据的地址,就叫做 引用
- 使用
id()
函数可以查看变量中保存数据所在的 内存地址
注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用
- 变量 不再 对之前的数据引用
- 变量 改为 对新赋值的数据引用
1.3 可变和不可变类型
- 不可变类型,内存中的数据不允许被修改:
- 数字类型
int
,bool
,float
,complex
,long(2.x)
- 字符串
str
- 元组
tuple
- 可变类型,内存中的数据可以被修改:
- 列表
list
- 字典
dict
注意:字典的
key
只能使用不可变类型的数据
- 可变类型的数据变化,是通过 方法 来实现的
- 如果给一个可变类型的变量,赋值了一个新的数据,引用会修改
- 变量 不再 对之前的数据引用
- 变量 改为 对新赋值的数据引用
有了以上知识之后我们可以在ipython交互式的shell中进行一个验证:
In [1]: a = 1
In [2]: b = 2
In [3]: id(a)
Out[3]: 10910400
In [4]: id(1)
Out[4]: 10910400
In [5]: id(b)
Out[5]: 10910432
In [6]: id(2)
Out[6]: 10910432
In [7]: b = 1
In [8]: a = 2
In [9]: id(a)
Out[9]: 10910432
In [10]: id(b)
Out[10]: 10910400
根据这个执行结果,可以猜测,当Python代码中出现了新的数字(不可变)时,会为这个数字分配一个内存空间(下面用小盒子比喻),而变量则是引用了这个内存空间。
这一点与C不同,在C中我们定义变量时要先指定类型,这时候C编译器会为我们开辟一个内存空间,这个内存空间会有一个地址,并且里面存着变量的值。
我们可以把C中的变量理解为我们为这个内存空间起的一个“名字”,当修改变量的值的时候,地址不会发生变化,变化的是里面存储的值。
而在Python中,我们可以把变量理解为一个“标签”,这个“标签”在赋值时被贴到了一个“小盒子”上,而“小盒子”里面存储的就是实际的数据(有一点类似C里的指针,但不完全相同),当修改变量的值的时候(使用赋值语句),我们并不会修改原来的“小盒子”里的内容也就是10910400这个地址里面的值,而是会把贴在10910400这个“小盒子”上的标签 a 撕下来,贴在10910432这个“小盒子”上。
以上的论述可以用以下的图片来帮助我们理解:
python中刚开始赋值的时候
修改值之后
而在C中,刚开始赋值的时候
修改值之后