0101002 变量
-
参考文献
-
[美] 迈克尔·T.古德里奇(Michael T.Goodrich)等著;张晓等译. 【数据结构与算法:Python语言实现 第1版】. 北京:机械工业出版社,2018.9
- 书名原文:Data Structures and Algorithms in Python
-
[美] 马克·卢茨(Mark Lutz)著;秦鹤,林明译.【Python学习手 第5版】. 北京:机械工业出版社,2018.8
- 书名原文:Learning Python,Fifth Edition
1. 从一条赋值语句开始
# 我的第一行Python语句
a = 3
上述语句的含义:创建(定义)了一个变量a,并将int型的值3赋值给变量a。也可以理解为“标识符a引用了int类的一个值为3的实例化对象”。
由此引入三个问题:
1. 变量a在定义的时候为什么没有显式的声明类型?
2. 为什么3是一个int类型?
3. =是做什么的?
1.1 Python是动态类型语言
1.1.1 静态类型语言
- 如果类型检查发生在编译阶段(Compile Time),那么是静态类型语言(Statically Typed Languages)。静态类型语言变量的类型在创建时必须显式的声明,因为变量的类型检查(确定)在编译时就需要明确。
// 静态类型语言C#创建一个变量的语句
int a = 10; // 定义变量必须显式的声明类型
1.1.2 动态类型语音
- 如果类型检查发生在运行阶段(Run Time),那么是动态类型语言(Dynamically Typed Languages)。动态类型语言变量的类型在创建时不需要显式的声明,因为变量的类型检查(确定)在运行时才明确。
# 动态类型语音Python创建一个变量的语句
a = 3 # 定义变量类型时不需要显式的声明类型
1.2 类、构造方法、对象
1.2.1 实例化
- 实例化:创建一个类的新实例的过程被称为实例化。
- 类与对象:通过调用类的构造方法来实例化对象。
// 在C#中,假设存在一个Computer类,在该类中有一个Computer()无参的构造方法。
Computer computer = new Computer(); // 通过new关键字调用Computer()这个构造方法创建了Computer类的实例化对象computer。
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
# 在Python中,假设存在一个Computer类,在该类中有一个Computer()无参的构造方法。
computer = Computer() # 通过调用Computer()这个构造方法创建Computer类的实例化对象computer。
说明:类在磁盘的文件当中,对象在内存当中,实例化的本质就是将磁盘文件中的类加载成为内存当中的该类的对象。
1.2.2 Python的内置类
-
Python中常用的内置类:bool,int,float,list,tuple,str,set,dict。
-
Python的内置类支持字面形式指定新的实例
a = 3 # “="右边是创建int类的新实例,即通过字面形式3指定了一个值(属性)为3的int型对象。<! 注:这个表述不一定准确!>
1.3 变量、对象、引用
![图片链接丢失](https://i-blog.csdnimg.cn/blog_migrate/790da3ace4b6552a0db6d1f95714b791.png)
1.3.1 a = 3的三个步骤
- step1 => 创建一个对象来代表值3。
- step2 => 创建一个变量a。
- step3 => 将变量a与值3相连接
1.3.2 引用
- 在Python中从变量到对象的连接称作引用,引用是一种关系,通过内存中的指针的形式来实现,这句话用专业术语表述为
- 变量是一个系统表的入口,包含了指向对象的连接。
- 对象是被分配到的一块内存,有足够的空间去表示它们所代表的值。
- 引用时自动形成的从变量到对象的指针。
2. 变量的内存图解
2.1 Python中对象的三要素
![图片链接丢失](https://i-blog.csdnimg.cn/blog_migrate/6a07e36d70f30c5e7718d1404272baac.png)
- Python当中每个对象都有三个要素:身份(Identity),类型(Type)和值(Value)。
name = 'Jax' # 创建一个字符串对象,并将这个对象赋值给变量name。
print(id(name)) # 对象的唯一标识,即该对象的内存地址,id()方法默认返回对象十进制的地址值。
print(type(name)) # 对象含有标准的头部信息,即类型标识符,用于标识对象的类型。
print(name) # 表示对象存储的数据的值,使用内置函数print()可以直接打印值。
控制台输出:
1811887836272
<class 'str'>
Jax
2.2. 变量的内存图解
str1 = "abc"
str1 = "ABC"
print(str1)
控制台输出:
ABC
说明:
1.
—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—
str2 = str3 = "abc"
print(str2)
print(str3)
控制台输出:
abc
abc
2.3 共享引用
a = 3
b = a
print(id(a))
print(id(b))
控制台输出:
1952153776
1952153776
由此引入的问题:为什么变量a和变量b的唯一标识相同?
2.1.2 引用传递和值传递
1.1 变量名是一个标识符
1.1.1 标识符规则
-
Python中标识符是严格区分大小写,由子母、数字和下划线组成。
-
首字符不能是数字,且不能使用关键字。
-
标识符要有意义,且不能使用中文。
-
驼峰命名法
- 大驼峰命名法:每个单次首字母大写,如mycar => MyCar(类、方法)
- 小驼峰命名法:除了第一个单词首字母小写之外,剩下单词首字符大写,如mycar => myCar(变量)
-
下划线命名法
- 将不同的单词用_拼接在一起,如mycar => my_car。