python中、变量指向的对象可以发生变化_python基础复习

一. 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对应的值因为不再有对象指向它,就会被垃圾回收。

画一个例子表示不可变对象,在内存中的变化:

50f801f4ba81e411f71bf2ebc3babc1a.png

>>> 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不变。

画一个例子表示可变对象,在内存中的变化:

89328115046fcf37f1d81b63a23474fd.png

执行append之后的样子:

9941c600fa5d7d027356338c525857c1.png

三. 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 模块内的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值