1、习题 4: 变量(variable)和命名
学习目标:了解Python中变量的定义,学习定义简明易记的变量名
变量:变量是存储内存中的值,就是每定义一个变量就会在内存中开辟一个空间。基于变量的类型。解释器会分配指定的内存,并解决什么数据可以被存储到内存中。
在Python中使用变量时,变量不需要提前定义,只需要给变量赋值即可,赋值的过程就是创建这个变量的过程。但是如果要使用这个变量,必须要给这个变量赋值。
变量的命名规则:
- 变量名只能是字母、数字、下划线的任意组合,但是不能是数字开头,且不能包含空格
- 不能使用Python预留的关键字
- Python支持中文变量名,但是一般不建议使用
- 变量名要有意义,有描述性,简明,一般采用驼峰式命名方法
习题四中的练习代码是:
# 定义汽车数量的变量car ,并给变量car赋值为100
cars = 100
# 定义汽车内空间的变量space_in_a_car ,并为其赋值4.0
space_in_a_car = 4.0
# 定义司机人数的变量drivers , 并为其赋值30
drivers = 30
# 定义乘客数量的变量drivers , 并为其赋值30
passengers = 90
# 定义无法行驶的车辆数量的变量cars_not_driven ,其值为上面定义的cars变量和drivers变量相减为70
cars_not_driven = cars - drivers
# 再定义可以形式的车辆数量变量cars_driven , 然后将变量drivers的值赋值给变量cars_driven
cars_driven = drivers
# 定义最大拼车容量的变量carpool_capacity,将变量cars_driven和变量space_in_a_car值做乘法为120.0
carpool_capacity = cars_driven * space_in_a_car
# 定义变量平均每辆车中的乘客数量变量average_passengers_per_car ,将变量passengers和变量cars_driven值做除法得到结果为3
average_passengers_per_car = passengers / cars_driven
# 下面是打印输出变量所代表的值
print "There are", cars, "cars avaiable."
print "There are only", drivers, "drivers avaiable."
print "There will be", cars_not_driven, "empty cars today"
print "We can transport", carpool_capacity, "people today."
print "We have", passengers, "to carpool today."
print "We need to put about", average_passengers_per_car, "in each car."
上述代码的运行结果为:
C:\Python27\python.exe D:/pythoncode/stupid_way_study/demo4/Exer4-1.py
There are 100 cars avaiable.
There are only 30 drivers avaiable.
There will be 70 empty cars today
We can transport 120.0 people today.
We have 90 to carpool today.
We need to put about 3 in each car.
在上面练习代码时,不注意程序运行后报了个错:
原因:报错提示是说在第19行car_pool_capacity这个变量没有定义,我们知道变量在使用前必须要先赋值,但是上面赋值的变量是carpool_capacity,和写错的变量名差了一个下划线,说明这是两个变量,不能混用。
2、加分习题:
- 我在程序里用了 4.0 作为 space_in_a_car 的值,这样做有必要吗?如果只用 4
会有什么问题? - 记住 4.0 是一个“浮点数”,自己研究一下这是什么意思。
- 记住 = 的名字是等于(equal),它的作用是为东西取名,记住 _ 是下划线字符(underscore)。
- 将 python 作为计算器运行起来,就跟以前一样,不过这一次在计算过程中使用变
量名来做计算,常见的变量名有 i , x , j 等等。
3、我的答案:
1、我在程序里用了 4.0 作为 space_in_a_car 的值,这样做有必要吗?如果只用 4
会有什么问题
没有必须,因为在Python2中,整数运算中只有除法运算中才会产生小数部分被舍弃的情况,乘法中并不会产生丢弃小数部分的情况,Python3中默认是都不会舍弃小数部分。
2、浮点数的概念?
这个问题具体详情见上一章浮点数的定义,这里就不做过多的赘述了。
3、 = (等号)的名字是等于(equal),它的作用是为东西取名
变量的赋值就是采用 “=” 来实现的,就是把等号右边的值赋给等号左边的变量
4、扩展:
变量的赋值不仅仅是单纯的变量赋值,还涉及到内存的分配,所以赋值的变量和不赋值的变量时不一样的,下面来举个栗子:
4.1、我名字变了吗?
name1 = "Kang" #定义变量name1,并赋值为Kang
name2 = name1 #定义变量name2,并将name1的值赋给name2
#打印输出name1 和 name2的值
print "第一次输出结果:name1=",name1
print "第一次输出结果:name2=",name2
name1 = "Jack" #再次为变量name1赋值为新值Jack
#打印输出name1 和 name2的值
print "第二次输出结果:name1=",name1
print "第二次输出结果:name2=",name2
C:\Python27\python.exe D:/pythoncode/stupid_way_study/demo4/Exer4-2.py
第一次输出结果:name1= Kang
第一次输出结果:name2= Kang
第二次输出结果:name1= Jack
第二次输出结果:name2= Kang
由上面的运行结果可以看出来,最后的运行结果是name1 = Jack ,name2 = Kang,?
这里很多人就会问了,上面不是进行了赋值操作吗,name2 = name1,然后name1值变了,name2的值不也应该跟着变吗?
但是实际 情况不是这样的,因为这Python中变量的赋值其实是一个内存地址的引用,其之间只是一个地址的引用,变量之间没有其他关系,比如上面name2 变量只是将变量name1 当做一个寻找对象的一个桥梁,其之间没有其他任何关系。
详细解释:
name1 = Kang
name2 = name1
这两句代码,第一句是一个变量赋值的过程,在内存中开辟出一个位置,存储值Kang,然以就相当于建立了一个对应关系,name1 -----> Kang , 下一句name2 = name1 ,其实只是name2 通过变量name1 去寻找对应的值,相当于中间的一个过渡桥梁,name1和name2之间并没有任何关系。
name1 = "Jack"
上面的name1 = "Jack",确实是一个新的赋值操作,这样name1的值肯定是会变的,但是name2 的值是不会变的,因为Python的变量赋值操作其实就是和内存中的一块地址建立对应关系,变量赋新值,就相当于新建立了一条对应关系,不会说对应关系变了,内存中值也会变,其实内存中地址肯定是不会变的,变的只是指向这块地址的对应关系。而且name2 = name1,他们之间没有其他关系,仅仅是一个桥梁传递作用,name2通过name1找到了内存中对应的值而已。所以上面name1赋新值,name2的值并没有变,因为name2的对应关系没有变。
上述例子就是变量和内存间的关系,用老男孩金角大王的例子就是,内存地址就是相当于小区的房子,变量名就是相当于房子的门牌号,不可能说拆除了门牌号就是拆除房子。变量的重新赋值只是相当于给房子换个门牌号,房子还在,只是门牌号变了而已。
4.2、Python中的内存回收机制:
说上面这个又涉及到Python中的内存回收机制,Python和C语言不同,C中需要手动释放内存地址,但是Python不用,Python中内存是自动回收的,Python中有一个计数器,当其值为0时就自动清除掉,重新定义变量后之前的内存就会被清掉。当然Python中也支持手动回收内存,使用del 变量名的形式。
手动回收如下:
4.3、对多个变量赋值
Python中允许同事为多个变量赋值,例:
a = b = c = 1
以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上,建立三个对应关系。
a, b, c = 1, 2, "Kang"
以上实例,两个整型对象 1 和 2 分别分配给变量 a 和 b,字符串对象 "kang" 分配给变量 c。
4.4、标准数据类型
在内存中存储的数据可以有多种类型。例如,一个人的年龄可以用数字来存储,他的名字可以用字符来存储。Python 定义了一些标准类型,用于存储各种类型的数据。
Python有五个标准的数据类型:
- Numbers(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Dictionary(字典)
5、总结
此习题是学习了Python中的变量定义,首先要明白变量的命名规则,其实是了解变量和Python的内存地址之间的关系。