WilburDing's Blog

Keep track of my life

什么是变量

| Comments

当我们初学计算机语言的时候,就接触到了变量的概念,当然,那时候不可能给出精确的定义,很多书在讲的时候就像大家看到了变量这个词大概就能知道它是什么一样无需解释,比如《C语言程序设计》里直接就提到了变量的说明而没有说什么是变量。当我们带着这种模糊的感觉变成“有经验”的程序员时,似乎已经没人在意变量究竟是什么了。人世间的悲哀莫不如此……

Wikipedia里给的Variable的定义如下:

In computer programming, a variable is a storage location and an associated symbolic name (an identifier) which contains some known or unknown quantity or information, a value.

翻译下就是说,变量是一个存储位置和一个关联的符号名字,这个存储位置包含了一些已知或未知的量或者信息,即值。在C语言里,变量是如下三方面的统一体:

  1. 名字(运行时会变成数字化的名字,内存地址)
  2. 存储位置(某一位置开始的一定大小的存储空间)
  3. 该存储位置里内容的解释方式(即类型,整数、浮点数还是字符串?)

任意一部分单独都不是变量。当我们给一个变量a赋值另一个值时,改变的是a对应的存储位置里的内容,赋值前后是同一个a,因为1、2、3都没有变。

这个定义适用于C这种语言,它面向的是字节的世界。由于一个字节的表达能力有限,我们需要若干个字节来表达一些复杂的概念,所以一个变量需要确定它在内存地址中的位置、多大以及解释方式。而对于Python这种语言,它抽象的是对象的世界,没有更底层的字节这样的东西,那Python中的变量是什么呢?

如果我们把Python语言的内存空间视为对象的空间,即不象C语言那样内存地址指向的是字节而是Python对象,甚至这个地址也不会像C语言的那样是数字而可能就是源代码里的名字,那Python的对象就是如下两方面的统一体:

  1. 名字
  2. 存储位置(可以存放任意的对象)

所以,Python里给变量赋值就是把对象放到变量关联的存储位置上。如从CPython的实现角度讲,函数局部变量存储位置对应函数的f_locals数组下标,赋值就是把对应下标位置的元素指向新对象。

绕了一圈,发现Wikipedia里的定义算是普适的,只是“存储位置”的概念也要看成抽象的,而不是简单的C语言面对的内存位置。

Comments