变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型,比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型。
所谓常量就是不能改变的变量,我们现实世界中存在这样的不可改变的东西,比如圆周率 π,万有引力常量 G 等等都是不可改变的量。
本节我们学习变量和常量的定义和语法。
在程序中我们用一个变量名来表示变量,变量名的写法必须是大小写英文,数字和_的组合,且记不能用数字开头。小说明:英文符号
#
表示注释,#
后面的内容程序在执行时会忽略掉,只有我们程序员才能看到。
name = "jack" NAME = "jack" _name = "jack" name2 = "jack" 2name = "jack" # 错误:数字不能在前面 name! = "jack" # 错误:不支持其它字符
Python 中内置一些关键字(我们可以使用 keyword 模块提供的函数打印出当前 Python 解释器规定的所有关键字,注意 Python 版本不同,所规定的关键字有所变化),虽然这些关键字符合变量的命名规则,但是 Python 解释器规定不能使用这些关键字作为变量名,否则解释器报语法错误。
import keyword print(keyword.kwlist) # 列出当前 Python 解释器的所有关键字 and = 9 # 关键字 and 不可以作为变量名
在 Python 中,英文等号 = 是赋值运算符,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,程序中的等号和数学上的等号不是一个意思, Python 程序中用两个等号来表示数学上的等号。
data = 2 print(data) data = True print(data) data = "老鸟Python" print(data) print(2 == 2)
我们也可以把一个变量赋值给另一个变量,这个操作实际上是修改变量指向另一个变量所指向的数据,看如下代码。
strone = "Python" strtwo = strone strone = "Hello" print(strone) print(strtwo)
我们对以上代码进行分析,看看每一句代码在内存中是如何表示的,对于第一句代码
strone = "Python"
,Python 解释器首先检查字符串
"Python" 中的每个字符在内存中是不是存在,如果不存在就给每个字符分配内存空间,如果存在则不给该字符创建内存,然后
Python 解释器再次在内存中开辟一块内存(比如内存地址为:0x8899aa 的地方)存放字符串 "Python"
中每个字符的地址,然后 Python 解释器再次在内存中开辟一块内存存放 strone 变量(比如内存地址为:0x223388),
strone 变量的值就是字符串 "Python"的地址。注意:0x 开头是表示用十六进制表示数值。
对于第二句代码 strtwo = strone
,Python
解释器再次在内存中开辟一块内存存放 strtwo 变量(比如内存地址为:0x223399),然后 Python 解释器把
strone 变量内存里面的值(0x8899aa)赋值给 strtwo 的内存,目前执行上面两句代码后的内存模型如下图。
对于第三句代码 strone = "Hello"
,Python 解释器首先检查字符串 "Hello"
中的每个字符在内存中是不是存在,如果不存在就给每个字符分配内存空间,如果存在则不给该字符创建内存,
Python 解释器再次在内存中开辟一块内存(比如内存地址为:0x8899bb 的地方)存放字符串 "Hello"
中每个字符的地址,然后 Python 解释器把字符串 "Hello" 的地址(0x8899bb)赋值给 strone 的内存,最后的结果是
strone 内存的值为 0x8899bb,strtwo 内存的值为 0x8899aa,如下图。
注意:"Hello"字符串中 有两个 l
字符成员,在 Python 解释器第一次给 l
分配内存后,就不会再给第二个 l
分配内存了,所以字符串 "Hello" 中两个 l
成员的内存地址是一样的,大家可以通过 Python 的 id 函数验证一下字符串中两个 l
成员的地址是否一样。
strone = "Hello" print(id(strone[2])) # 第一个 l 成员的内存地址 print(id(strone[3])) # 第二个 l 的内存地址
所谓常量就是不能改变的变量,Python 中定义常量和其它语言中定义常量不同,比如 c++ 语言可以在变量名前加上关键字 const 来定义这个变量是常量,常量在定义的时候必须初始化,在这之后就不能修改该常量的值,否则解释器会报错。 Python 语言没有关键字可以把一个变量定义成一个常量,所以 Python 语言本身并没有常量的语法定义,但我们一般对全大写字母命名的变量来假定它是常量,程序员本身约定成俗就行了。
PI = 3.14159 # 告诉程序员变量 PI 不要修改。 PI = 3.2 # 虽然修改解释器不会报错,但最好不要修改。 print(PI)
在任何编程语言中,字符串都是存放在常量区,所以我们都说字符串是常量值,也就是说任何一个变量的值如果是字符串的话,我们则不能通过该变量修改字符串内的值。
strone = "Hello" strone[1] = "x" # Python 解释器会报错
Python 基本类型中的数字,字符串,None 和 bool 值(True 和 False)本身不能修改,我们通常把这些数据类型的值叫做右值,但在 Python2 中布尔值可以修改。
8 = 9 # 8是右值,并且 8 本身不符合变量名命名规则 "hello" = "byebye" # "hello" 是右值,并且不符合变量名命名规则 None = 8 # None 是右值,不可以修改 False = True # False 是右值,不可以修改
深刻理解 Python 语言中变量的内存模型。
要知道 python 中的常量的约定写法。
著名公司(某东)笔试题:画出三句代码 dataone = 8, datatwo = 5, dataone = datatwo
每一步的内存模型。
dataone = 8
print(id(dataone))
datatwo = 5
print(id(datatwo))
dataone = datatwo
print(dataone)
print(id(dataone))
print(dataone is datatwo)
dataone = 8
print(id(dataone))
datatwo = 5
print(id(datatwo))
dataone = datatwo
print(dataone)
print(id(dataone))
print(dataone is datatwo)
结果
C:\Python27\python.exe D:/python_one/myfirst.py/mytest4.py
42689232
42689304
5
42689304
True
Process finished with exit code 0
dataone = 8 print(id(dataone)) datatwo = 5 print(id(datatwo)) dataone = datatwo print(dataone) print(id(dataone)) print(datatwo) print(id(datatwo)) print(dataone is datatwo)
结果:
92496144
92496216
5
92496216
5
92496216
True
dataone = 8
print(id(dataone))
datatwo = 5
print(id(datatwo))
dataone = datatwo
print(dataone)
print(id(dataone))
print(dataone is datatwo)
140718318318048
140718318317952
5
140718318317952
True
dataone = 8 print(id(dataone)) datatwo = 5 print(id(datatwo)) dataone = datatwo print(dataone) print(id(dataone)) print(dataone is datatwo)
结果
140718318318048 140718318317952 5 140718318317952 True
dataone = 8 print(id(dataone)) datatwo = 5 print(id(datatwo)) dataone = datatwo print(dataone) print(id(dataone)) print(dataone is datatwo)
140718318318048 140718318317952 5 140718318317952 True
dataone = 8
print(id(dataone))
datatwo = 5
print(id(datatwo))
dataone = datatwo
print(dataone)
print(id(dataone))
print(dataone is datatwo)
140705140011488
140705140011392
5
140705140011392
True
dataone = 8 print(id(dataone)) datatwo = 5 print(id(datatwo)) dataone = datatwo print(dataone) print(id(dataone)) print(dataone is datatwo)
输出结果如下:
140705140011488 140705140011392 5 140705140011392 True
dataone = 8
print(id(dataone))
datatwo = 5
dataone = datatwo
print(dataone)
print(datatwo)
print(id(dataone))
print(id(datatwo))
运行结果:
140711139726592
5
5
140711139726496
140711139726496
我是一个初学者 以前只是在大学里学过C 希望跟你多多学习!
教程很贴合广大学生的实际,真的很赞!
第一次浏览你的网页很感谢你,希望你能够继续在这方面付出。
看了你写的BOLG受益良多 希望你能贡献更多更好等教程
dataone = 8
print(id(dataone))
datatwo = 5
print(id(datatwo))
dataone = datatwo
print(dataone)
print(id(dataone))
print(dataone is datatwo)
140718318318048
140718318317952
5
140718318317952
True