变量与常量
# 变量与常量
# 简介
任何编程语言都需要处理数据,比如数字、字符串、字符等,我们可以直接使用数据,也可以将数据保存到变量中,方便以后使用。
变量(Variable)可以看成一个小箱子,专门用来“盛装”程序中的数据。每个变量都拥有独一无二的名字,通过变量的名字就能找到变量中的数据。
从底层看,程序中的数据最终都要放到内存(内存条)中,变量其实就是这块内存的名字。
和变量相对应的是常量(Constant),它们都是用来“盛装”数据的小箱子,不同的是:变量保存的数据可以被多次修改,而常量一旦保存某个数据之后就不能修改了
# 链接资料
c语言中文网
自己gitee总结
# 1. 变量
变量**是一块保留的内存区域(内存地址)来存储值。**格式为: 【变量名 = 值】,通过变量名来操作其对应的值。例如:
age = 18
name = "xxx"
2
弱类型语言有两个特点:
- 变量无须声明就可以直接赋值,对一个不存在的变量赋值就相当于定义了一个新变量。
- 变量的数据类型可以随时改变,比如,同一个变量可以一会儿被赋值为整数,一会儿被赋值为字符串。
# 1.1 变量名规范
Python中的变量名不是随便定义的,关于变量名的定义需要遵循如下规范:
三条规范(必须遵循,否则定义变量会报错)
- 变量名只能由 字母、数字、下划线 组成。
- 变量名不能以数字开头。
- 变量名不能是Python内置关键字,如:[‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘exec’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘not’, ‘or’, ‘pass’, ‘print’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]
二条建议(遵循可以显得更加专业,不遵循也可以正常运行不报错)
下划线命名法,多个单词表示的变量名用下划线连接(均小写)
father_age = 18 father_name = "xxx"
1
2见名知意,通过阅读变量名就能知道此变量的含义。
age = 18 color = "red" current_user_first_name = "xxx"
1
2
3
# 1.2 *向多个变量赋值*
Python 允许您在一行中为多个变量赋值:
x, y, z = "Orange", "Banana", "Cherry"
print(x)
print(y)
print(z)
2
3
4
# 1.3 变量交换
x = 1
y = 2
x1, y1 = y, x
print(x1)
print(y1)
2
3
4
5
# 1.4 内存指向
通过学习上述变量知识让我们对变量了有了初步认识,接下来我们就要从稍稍高级一些的角度来学习变量,即:内存指向(在电脑的内存中是怎么存储的)。
情景一
name = "xxx"
在计算机的内存中创建一块区域保存字符串”xxx”,name变量名则指向这块区域。
情景二
name = "xxx"
name = "aaa"
2
在计算机的内存中创建一块区域保存字符串”xxx”,name变量名则指向这块区域。然后又再内存中创建了一块域保存字符串”aaa”,name变量名则指向”aaa”所在的区域,不再指向”xxx”所在区域(无人指向的数据会被标记为垃圾,由解释器自动化回收)
情景三
name = "xxx"
new_name = name
2
在计算机的内存中创建一块区域保存字符串”xxx”,name变量名则指向这块区域。new_name变量名指向name变量,因为被指向的是变量名,所以自动会转指向到name变量代表的内存区域。
情景四
name = "xxx"
new_name = name
name = "aaa"
2
3
在计算机的内存中创建一块区域保存字符串”xxx”,name变量名则指向这块区域(灰色线), 然后new_name指向name所指向的内存区域,最后又创建了一块区域存放”aaa”,让name变量指向”aaa”所在区域.
情景五
num = 18
age = str(num)
2
在计算机的内存中创建一块区域保存整型18,name变量名则指向这块区域。通过类型转换依据整型18再在内存中创建一个字符串”18”, age变量指向保存这个字符串的内存区域。
# 1.5 Python中变量在内存中的存储(放置到数据类型)
# 1. 引用和对象
- 对象:当创建数据对象时,在内存中会保存对象的值,这个值就是对象自己
- 引用:对象保存在内存空间,外部想要使用对象的值,就需要使用引用来操作对象。内存中会保存对象引用的数量,当某个对象的引用为0时,对象就会被回收。
# 2. 可变数据类型和不可变数据类型
可变数据类型
可变数据类型:允许变量的值进行改变,对于变量给值的过程中,只是改变了变量的值,而不会新建一个对象,所以可变数据类型的意思就是说对一个变量进行操作时,其值是可变的,值的变化并不会引起新建对象,即地址是不会变的,只是地址中的内容变化了或者地址得到了扩充。
1不可变数据类型
对象本身的值不可变,如果改变了变量的值,相当于新建一个对象,而对于相同的值的对象,在内存中只有一个对象
1
可变数据对象:列表(list)、字典(dict)
不可变数据对象:数值类型(int、float、bool)、string(字符串)、tuple(元组)
注:此处的可变和不可变,是指内存中的对象(value)是否可以改变,对于不可变类型的对象,在对对象进行操作的时候,必须要在内存中重新开辟一块新的区域。对于可变类型的对象,在对对象进行操作的时候,不会重新申请新的地址,而是在该 对象的地址后面继续申请即可。
总结:可变数据类型更改值后,内存地址不发生改变;不可变数据类型更改值后,内存地址发生改变。
# 3. 引用传递和值传递(函数传值)
说明:可变对象为引用传递,不可变对象为值传递。
引用传递:传递列表或者字典时,如果改变引用的值,就修改了原始的对象
def check(a): # 因为列表是可变对象 print(a) print(id(a)) a.append([1, 2, 3]) return a a = [3, 4, 5] print(check(a)) print(id(a)) """ [3, 4, 5] 44909288 [3, 4, 5, [1, 2, 3]] 44909288 """
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16值传递:当传递不可变对象时,如果改变引用变量的值,只是创建了不同的对象,原始对象并没有改变
def check1(a): # 因为字符串是不可变对象,所有重新创建了地址 print(a) print(id(a)) a = "i am test" print(id(a)) return a a = "This is aa" print(check1(a)) print(id(a)) """ This is aa 58547040 58547120 i am test 58547040 """
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 2. 常量
常量就是不变的变量,比如常用的数学常数圆周率就是一个常量。在Python
中,通常用全部大写的变量名表示常量:
PI = 3.14159265359
print(PI)
PI = 2
print(PI)
"""
3.14159265359
2
"""
2
3
4
5
6
7
8
9
但事实上,从Python
语法角度看,PI仍然是一个变量,因为Python
根本没有任何机制保证PI不会被改变。你完全可以给PI赋值为10,不会弹出任何错误。所以,用全部大写的变量名表示常量只是一个习惯上的用法。