文章目录
一. python中一切皆对象
参考
Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。
Python中的所有对象都有三个特点:
• 身份:每个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数id()来得到,可以简单的理解为这个值式对象的内存地址
• 类型:对象的类型决定了对象可以保存什么类型的值,有哪些属性和方法,可以进行哪些操作,遵循怎样的规则。可以使用内建函数 type() 来查看对象的类型
• 值:对象所表示的数据
Python 中的一切都可以赋值给变量或者作为参数传递给函数。
二. python中的可变对象和不可变对象
参考
python中对象可分为:可变对象和不可变对象
- 什么是可变对象/不可变对象:
-
不可变对象:对象所指向的内存中的值不能被改变,当改变这个变量的时候,原来指向的内存中的值不变,变量不再指向原来的值,而是开辟一块新的内存,变量指向新的内存。
不可变:int、字符串(str)、float、(数值型number)、元组(tuple)、None(空) -
可变对象:对象存放在地址中的值会原地改变
可变:字典型(dictionary)、列表型(list), set(集合)
# 不可变对象
>>> a=5
>>> print id(a)
140433054259208
>>> a= 4
>>> print id(a)
140433054259232
>>> print id(a),id(4)
140433054259232 140433054259232
>>> print id(a),id(5)
140433054259232 140433054259208
打印的结果表明:不可变对象int的变量a改变后,未改变之前指向内存中5,改变后开辟一块新内存指向4
由于是不可变对象,变量对应内存的值不允许被改变。当变量要改变时,实际上是把原来的值复制一份后再改变,开辟一个新的地址,astr再指向这个新的地址(所以前后astr的id不一样),原来astr对应的值因为不再有对象指向它,就会被垃圾回收。
画一个例子表示不可变对象,在内存中的变化:
>>> list=[1,2,3,4]
>>> print id(list)
4384947808
>>> list[2]=5
>>> print list
[1, 2, 5, 4]
>>> print id(list)
4384947808
结果表明: 列表list在改变前后id并未发生改变,可变对象由于所指对象可以被修改,所以无需复制一份之后再改变,直接原地改变,所以不会开辟新的内存,改变前后id不变。
画一个例子表示可变对象,在内存中的变化:
执行append之后的样子:
三. is和==比较
参考
is 用于判断两个变量引用对象是否为同一个,即id是否相同, == 用于判断引用变量的值是否相等。
搜了好多,感觉自己测试的结果和别人的博客中结果总是不一样,不知道怎么回事,反正很少比较地址,一般都是比较值,所以一般都是用==
python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;
可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
四. python基本数据类型
详细介绍参考
参考文档
参考博客
常用方法参考
Python 3中有六个标准的数据类型:
Numbers(数字):int、float、bool、complex(复数)
String(字符串)
Tuple(元组)
List(列表)
Sets(集合)
Dictionaries(字典)
前三个不可变,后三个可变对象。
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
内置的 type()
函数可以用来查询变量所指的对象类型。
五. 三种基本结构:顺序、选择和循环
1. if
if 条件表达式: # 注意冒号
语句1 # 注意缩进
else:
语句1
多分支
if 条件表达式:
语句1
elif 条件表达式:
语句1
else:
语句1
2. 循环语句for和while
for 变量 in 序列:
语句1
for name in ['zhangsan','lisi','wangwu']:
print(name)
# 从1打印到10
for i in range(1,11):
print(i)
while 条件表达式:
语句1
3. break ,contineu ,pass
- break :无条件结束整个循环,简称循环猝死
- continei: 无条件结束本次循环,重新进入下一轮循环
- pass:表示略过,通常用于占位
六. 函数定义语法
- 函数的定义与调用
- 参数传递
可变类型和不可变类型
函数中的参数可以是:必须参数;关键字参数;默认参数;不定长参数。 - 匿名函数
七. 类,面向对象编程
参考博客:
- 类
定义;实例化;类的方法;初始化方法;私有属性和方法 - 继承
(1):直接调用父类属性方法
(2):强制调用父类私有属性方法
(3):重写父类属性方法
(4):调用父类的__init__方法
(5):继承父类初始化过程中的参数 - 多态
八. 变量的作用域
变量作用域各种案例参考
通常而言,在编程语言java和C中,变量的作用域从代码结构形式来看,有块级、函数、类、模块、包等由小到大的级别。但是在Python中,没有块级作用域,也就是类似if语句块、for语句块、with上下文管理器等等是不存在作用域概念的,他们等同于普通的语句。if语句中的变量可以在if外使用。
Python的作用域一共有4层,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内建作用域
global_var = 0 # 全局作用域
def outer():
out_var = 1 # 闭包函数外的函数中
def inner():
inner_var = 2 # 局部作用域
Python以L –> E –> G –>B的规则查找变量,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,最后去内建中找。
如果这样还找不到,那就提示变量不存在的错误。
- L(local)局部作用域
局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global
关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。 - E(enclosing)嵌套作用域
E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。 - G(global)全局作用域
即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
注意:全局作用域的作用范围仅限于单个模块文件内 - B(built-in)内置作用域
系统内固定模块里定义的变量,如预定义在builtin 模块内的变量。