WHCSRL 技术网

python基础学习笔记11:函数进阶

引用变量与可变、非可变类型

1、引用变量

在大多数编程语言中,值的传递通常可以分为两种形式值传递引用传递,但是在Python中变量的传递基本上都是引用传递

☆ 聊聊变量在内存底层的存储形式

a = 10
  • 1
  • 第一步:首先在计算机内存中创建一个数值10(占用一块内存空间)
  • 第二步:在栈空间中声明一个变量,如a
  • 第三步:把数值10的内存地址赋予给变量小a,形成所谓的引用关系
    在这里插入图片描述

☆ 如何验证Python中变量的引用关系

可以使用内置方法id(),其参数就是要显示的变量信息 => id(变量名称)

a = 10
print(id(a))
  • 1
  • 2

☆ 把一个变量赋予给另外一个变量的影响

a = 10
b = a
print(id(a))
print(id(b))
  • 1
  • 2
  • 3
  • 4

运行结果:
在这里插入图片描述
由以上运行结果可知,当我们把一个变量赋予给另外一个变量时,其两者指向的内存地址相同。就说明a和b指向了同一块内存空间,原理图如下:
在这里插入图片描述
思考

如果在b = a以后,我们改变了变量a的值,问变量b是否会受到影响?

# a = 10
# print(id(a))

a = 10
b = a

a = 100
print(b)  # 10 或 100

print(id(a))
print(id(b))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

总结

不可变数据类型(数值)在赋值以后,其中一个值的改变不影响另外一个变量,因为两者指向空间地址不同。如下图所示:
在这里插入图片描述

2、Python中可变和非可变数据类型

☆在Python中一共有几种数据类型?

7种:

  • 数值:int整型、float浮点类型
  • bool类型:True和False
  • 字符串类型:str
  • 元组 tuple: (1,2,3)
  • 列表 list: [1, 2, 3]
  • 字典 dict: {key:value}
  • 集合 set: {1, 2}

在Python中,我们可以把7种数据类型分为两大类:可变类型 + 非可变类型

  • 非可变类型

    • bool类型:True和False
    • 字符串类型:str
    • 元组 tuple: (1,2,3)
  • 可变类型

    • 列表 list: [1, 2, 3]
    • 字典 dict: {key:value}
    • 集合 set: {1, 2}

☆ 如何判断一个数据类型是可变类型还是非可变类型?

在Python中,可变类型与非可变类型主要是通过这个数据类型在内存中的表现形式来进行定义的。

  • 可变类型就是在内存中,其内存地址一旦固定,其值是可以发生改变的
a = [1, 2, 3]
print(id(a))

# 向内存中追加新数据
a.append(4)
print(id(a))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

  • 非可变类型就是在内存中,内存地址一旦固定,其值就没办法发生任何改变了
a = 10
print(id(a))

a = 'hello'
print(id(a))
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

3、可变类型与非可变类型在函数中的应用

可变类型

# 定义一个函数
def func(names):
    print(names)
    
# 定义一个全局变量
names = ['张三', '李四', '王五']
# 调用函数
func(names)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
综上所述,可变类型在函数中,如果在全局或局部中对可变类型进行增删改操作,其外部和内部都会受到影响

☆ 不可变类型

# 定义一个函数
def func(num):
    num += 1
    print(num)
    
# 定义一个全局变量
a = 10
# 调用函数
func(a)
# 在全局作用域中打印a
print(a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
综上所述,不可变类型在函数中,局部或全局的改变对外部和内部都没有任何影响

推荐阅读