1.Python中的变量

1.1 变量定义

  • 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建
  • 等号(=)用来给变量赋值
  • = 左边是一个变量名
  • = 右边是存储在变量中的值
变量名 = 值

变量定义之后,后续就可以直接使用了

在定义变量时不需要指定变量的类型, 解释器会自动根据赋值语句右边值的类型给变量指定类型。

1.2 变量的引用

  • 变量 和 数据 都是保存在 内存 中的
  • 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的

在 Python 中

  • 变量 和 数据 是分开存储的
  • 数据 保存在内存中的一个位置
  • 变量 中保存着数据在内存中的地址
  • 变量 中 记录数据的地址,就叫做 引用
  • 使用 id() 函数可以查看变量中保存数据所在的 内存地址

注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用

  • 变量 不再 对之前的数据引用
  • 变量 改为 对新赋值的数据引用

1.3 可变和不可变类型

  • 不可变类型,内存中的数据不允许被修改:
  • 数字类型 intboolfloatcomplexlong(2.x)
  • 字符串 str
  • 元组 tuple
  • 可变类型,内存中的数据可以被修改:
  • 列表 list
  • 字典 dict

注意:字典的 key 只能使用不可变类型的数据

  1. 可变类型的数据变化,是通过 方法 来实现的
  2. 如果给一个可变类型的变量,赋值了一个新的数据,引用会修改
  • 变量 不再 对之前的数据引用
  • 变量 改为 对新赋值的数据引用

有了以上知识之后我们可以在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中刚开始赋值的时候

python如何在函数中指明变量类型 python函数定义变量_数据

修改值之后 

python如何在函数中指明变量类型 python函数定义变量_Python_02

而在C中,刚开始赋值的时候

python如何在函数中指明变量类型 python函数定义变量_数据_03

修改值之后

python如何在函数中指明变量类型 python函数定义变量_数据_04

以上内容仅供参考,如有错误还望指证