「N体饭」python零基础入门系列 7.再论变量

「N体饭」Python零基础入门

作者:许立轩

简介:

这是一个Python计算机语言由浅入深的教程;
如果您是计算机“小白”, 您可以跟着教程一步一步地了解到Python是什么、能做什么;
如果您是久经沙场的极客,您也可以从中有所收获 :)

再论变量

大纲

视频地址https://www.bilibili.com/video/BV1KC4y187J2/

前言

如果您之前学过别的编程语言,比如C或C++,您会发现,在python中,不需要事先声明变量,只需要在使用前给变量赋值即可,所以我们把python称作弱类型语言,而把C或C++等称作强类型语言

变量并不等于python的6种基本数据类型,如果您把一个值赋值给一个变量,变量所做的工作只是帮您找到那个值而已,如果把值比作一栋建筑,那么变量只是指向它的路标

变量的赋值

用一个等号=来给变量赋值,它的左边是变量的命名,右边是变量指向的类型,要注意两个等号==是比较运算符

多个变量指向同一值

# 变量a指向字符串
a = '我是一个字符串'
# 也令变量b指向同一个字符串
b = a
# 现在有两个变量指向同一个字符串了

# 相等比较运算符,它的作用是比较变量指向的值是否相等
print(a == b) # True

上面的操作在内存里,大概长这样

「N体饭」python零基础入门系列 7.再论变量

同时赋值多个变量

您可以通过两种方式给多个变量赋值

1.可以同时为多个变量赋给同一值

a = b = c = '帅'
print(a,b,c) # 帅 帅 帅

上面的操作在内存里,大概长这样

「N体饭」python零基础入门系列 7.再论变量

2.可以同时为多个变量赋给不同值

a, b, c = '帅', '帅', '帅'
print(a,b,c) # 帅 帅 帅

别看它们都是字符串'帅',长得一样,但是在内存中它们是不同的数据

「N体饭」python零基础入门系列 7.再论变量

变量的删除

我们可以用python的保留字del(delete的简写)来删除一个变量

a = b = c = 'hello'

# 删除变量a
del a

# 再使用变量a的话,将会报错
# NameError: name 'a' is not defined
# print(a)

# 但是通过b或c依然能找到字符串'hello'
print(b,c)

python常量

常量就是变量,它一旦被赋予值了,就只能永远指向那个值,不能被改变

但不像C/C++等编程语言,在python中,并没有常量概念,一般通过约定俗成的变量名全大写的形式表示这是一个常量

比如:

YOU = '帅'
CN = '中国'

这只是一个君子约定,大写变量依然是可以被重新指向别的值的

学到后面,我们可以通过类来做到常量的功能

变量值的类型

在python中,我们可以通过内置函数type来查看变量值的类型是什么

a, b, c = 1, '2', (3,)
print(type(a)) # <class 'int'>
print(type(b)) # <class 'str'>
print(type(c)) # <class 'tuple'>

变量值的内存地址

在python中,我们可以通过内置函数id来查看变量值的唯一标识,可以把它当作是变量值在内存中的地址

a, b, c = '帅', '帅', '帅'
d = e = f = '帅'

# 以下输出都不一样
print(id(a)) # 140681948094912
print(id(b)) # 140681948095872
print(id(c)) # 140681948095152
# 以下输出都一样
print(id(d)) # 140681948096432
print(id(e)) # 140681948096432
print(id(f)) # 140681948096432

可以看到id出a、b、c的结果都不一致,所以虽然都是字符串'帅',但是它们在内存里是并不是同一个数据

id出d、e、f的结果却一样,所以是多个变量赋给同一值

is与==的区别

如果说 == 是比较两个值是否相等,那么 is 操作符就是比较两个值它们是否是同一个

还是接着拿上面的例子来说明

a, b, c = '帅', '帅', '帅'
d = e = f = '帅'

# 变量a与e它们的值是相等的
print(a == e) # True
# 但是它们并不是同一个数据
print(a is e) # False
# 变量d与e是指向同一个数据
print(d is e) # True
print(id(d) == id(e)) # True

所以,is实际上就是比较左右两边id的结果是否相等

变量值的引用计数

上面我们说过,可以用多个变量指向同一个值,那么怎样知道某个值,它被多少个变量引用呢?

可以通过python内置模块sysgetrefcount方法来查看

import sys
a = b = '引用计数'
print(sys.getrefcount(a)) # 3
c = a
print(sys.getrefcount(a)) # 4

之所以发现多了一个引用,是因为我们的字符串在传给getrefcount方法作为参数时,解释器创建了一个临时的引用

来看看下面的例子

import sys

a, b, c = 1, 1, 1
print(a is b) # True
print(b is c) # True
print(a is c) # True
# 引用计数显示整数1有2368个引用计数
print(sys.getrefcount(1)) # 2368

尽管是多个变量赋不同值的语法,但是变量abc都是指向同一个数据,这是因为python启动解释器的时候会创建一个小整数池或一些简单的字符串来常驻内存

python垃圾回收机制

在C/C++编程语言中,采用用户自己管理维护内存的方式,这种方式非常的*与高效,但是使用不当也会造成内存泄漏的问题

在python中,我们不需要自己管理内存,python采用垃圾回收机制(garbage collction)来管理内存

如果把一个数据比作一栋建筑,现在有两个方式来找到它(两个变量指向同一个数据),一个是高德地图,另一个是祖传指南针,那么通过它们俩,我们就能找到那栋建筑

如果出了啥意外,两个变量都找不着那栋建筑,会怎样?

那么我们人类再也没有任何的办法找到那栋建筑了,久而久之,那栋建筑就会因为风化,年久失修而被摧毁掉,就没了...没了...

在解释器中,也就是被当成垃圾,给回收掉了(从内存中移除)

也就是说,当一个值的引用计数变为0的时候,解释器就会将它从内存中剔除

# 现在有两个变量引用字符串'建筑'
a = '建筑'
b = a
# 删除变量a,引用计数减1
del a
# 删除变量b,引用计数减1
del b
# 引用计数为0
# 我们再也找不到那个它了
# 不久,它将会被解释器给回收

变量的命名法

变量的命名法也可以叫做变量的命名规范,它与变量的命名规则不一样,规则就像法律,我们必须遵守,但规范只是建议这样做

经典命名法一览

# 驼峰命名法:首字母小写,其余首字母大写
handsomeMan = 'you'

# 帕斯卡命名法:首字母皆为大写
HandsomeMan = 'you'

# 匈牙利命名法
# 匈牙利命名法是早期的规范,由微软的一个匈牙利人发明的,是 IDE 还十分智障的年代的产物。那个年代,当代码量很多的时候,想要确定一个变量的类# 型是很麻烦的,不像现在 IDE 都会给提示,所以才产生了这样一个命名规范,估计现在已经没啥人用了吧……一个十分系统却又琐碎的命名规范。
# 该命名规范,要求前缀字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,单词第一个字母大写。
iMyAge = 18 # "i": int
fMyHeight = 180  # "f": float

# 蛇型命名法:以下划线_连接单词
handsome_man = 'you'

python推荐蛇型命名法,因为python的中文名叫蟒蛇,它的图标就是一条蛇

「N体饭」python零基础入门系列 7.再论变量

学到后面,您会发现,python很多魔法属性都有下划线的踪影