变量基础
变量是编程语言里重要的基本概念,在各类高级语言里都用变量来代表一块内存区域,某一时刻这块区域里存储了‘a’,又一时刻可能又被存储成了’c’,正是由于该块内存里的值可以随时发生变化,我们称之这个代表内存区域的符号为变量。
变量本质
Python程序也是通过变量来访问某块内存里的数据,但Python里的变量的概念却和C语言里的变量有些不同,首先从变量的定义上来区分一下不同之处,在C语言里定义一个变量时,需要指定变量的数据类型,变量初始化时,还需依据等号左边变量的数据类型进行相应赋值,否则会出现数据的转换操作,造成不可想象的错误,而Python没有这方面的要求,在Python里定义变量不需要指定变量的数据类型,可以将各类数据直接赋值给等号左边的变量,比较自由,举例说明一下。
>>>x = 12
>>>print x12
>>>x = 13.09
>>>print x13.09
>>>x = "a1309b"
>>>print x'a1309b'
从上边的程序可以看出赋值时Python不关心变量x的数据类型是什么,学习过C语言的开发者都知道,C规定变量的类型是为了分配一定大小的数据内存区域,而Python定义变量时不指定变量类型,那么对于较长的数据怎么能存储的下呢?下面我们再看一段小程序说明一下为何Python不需要指定变量的类型也可以“存储”下任意长度数据的。
>>> x = 12
>>> type(x)
<type 'int'>
>>> x = '12'
>>> type(x)
<type 'str'>
>>> x = 12.03
>>> type(x)
<type 'float'>
>>> x = '12.0300203000404'
>>> type(x)
<type 'str'>
注:type函数是返回括号里表达式值的数据类型
上边代码x被分别被赋值整数12,字符串‘12’,浮点型数据12.03,但是都没有问题,都能正确执行,十分奇怪!如果数据很大能存下么(超出了4、8 字节)?我们看一下下面的程序,来分析一下Python的变量和C 语言的变量到底有哪些不同?
>>> x = 12
>>> id(x)
10416516
>>> x = 13
>>> id(x)
10416504
>>> x = '12'
>>> id(x)
19428056
>>> y = '12'
>>> id(y)
19428056
>>> y = 13
>>> id(y)
10416504
>>> y = 12
>>> id(y)
10416516
注:id函数是返回括号里Object在内存里的地址,读者请自行用id输出值作为内存地址,等号右边的值作为内存里的存储内容来画一个内存分布图分析一下。
10416516和10416516、10416504出现多次。
>>> help(id)
Help on built-in function id in module __builtin__:id(...) id(object) -> integer
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
>>>
当x和y被赋值12的时候id返回值相同,当x和y被赋值13的时候id 返回值也相同,当x 和y被赋值’12’ 的时候id的返回值也相同;但x 或者y被赋值12、13、’12’的候id的返回值不同!由此可见Python是在给等号右边的数据分配内存空间,可以通过不同的变量来指向这个数据。也可通过不同变量可以指向相同的内存空间获得相同的值。
>>> x = 12
>>> y = 13
>>> x = y
>>> x13
>>> id(x)
10416504
>>> id(y)10416504
>>>
可以通过变量来改变它正指向的这块内存空间里的数据么?不可以!
>>> x = 12
>>> id(x)
10416516
>>> x = 15
>>> id(x)
10416480
由上边结果可见,并未改变12所在内存区里的值,而是又分配了一个内存空间给数据15,也就是说变量在被重新赋值以后指向的是另外内存一个地方,和C语言变量的区别在于C里的变量一直指向某地,C语言可以通过变量来改变它指向内存里的值,而Python 里变量变化的是它“指向”,可以直接认为Python里的变量等价于C 语言里的指针概念。因此C和Python里都有变量的概念,但两个语言的变量的“变”的含义不同!