127-变量的可变、不可变类型
标准数据类型
Python3 中常见的数据类型有:
- Number(数字)
- String(字符串)
- bool(布尔类型)
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
Python3 的qi个标准数据类型中:
- 不可变数据(4 个): Number(数字)、String(字符串)、Tuple(元组)、布尔;
- 可变数据(3 个): List(列表)、Dictionary(字典)、Set(集合)。
不可变数据类型
num1 = 200
num2 = num1
num2 = 100
"""
这里num2是100,但是num1还是200,因为不可变数据类型赋值都是指针指向新内存空间,num1指向值为200的内存空间始终没变,变得是num2的指针。。。。。。
"""
举例子,这里用了新的id()
方法(查看内存地址)
num = 10
print(num)
print(id(num)) # 打印变量的内存地址:....0001
num2 = 10
print(id(num2)) # ....0001
num = 100
print(id(num)) # ....0002
# 探讨一种情况:
# 假设把变量num1赋值给变量num2,两者是什么关系呢?
# 结论:
# 如果把num1赋值给num2,相当于两者指向了相同的内存空间
# 问题:如果这个时候我更新了变量num1的值为100,问num2是否会受到影响
# 答:不会受到影响,因为数值10是一个数值类型=》不可变类型,一旦内存地址固定了,则里面的值就不能改变了,所以当我
# num1重新赋值,相当于在内存中新开辟了一块空间保存100,这num1和num2指向了不同的空间。所以不会产生任何影响
所谓的不可变类型就是当这个地址一旦固定,则其值无法改变的数据类型=>不可变类型
czc:要修改值,那就是在内存空间中新开一个空间放这个新值,然后把指针指向新的内存空间。所以对于函数接收的不可变数据类型就相当于一个新的变量指向这个值,当对他修改,就是新变量指针指向新值,这时候接受进来的老变量的指针还是指向原来的内存空间。所以这就是局部变量修改不会影响全局变量的原因,
要修改不可变数据类型就必须要提前声明global
gpt纠正
对于不可变数据类型(如整数、浮点数、字符串、元组等),当你尝试在函数内部修改这些数据时,实际上是创建了一个新的对象,并将局部变量的引用指向这个新对象。原始的全局变量不会受到影响,除非你使用 global 关键字显式地声明它,这样你就可以在函数内部修改全局变量。这是因为不可变对象不能被改变,每次修改都会生成一个新的对象。
不可变类型包括:数值类型、布尔类型、字符串类型、元组类型
比如原来这块空间里面放了数字10,想把它设置为100,不行,因为这块空间无法调整!
可变数据类型
所谓的可变数据类型就是内存地址一旦固定,其值是可以发生改变的
列表、字典、集合类型
#定义一个函数
def func(names2): # names1和局部变量name2都指向相同内存空间
#局部作用域
names2.append('赵六')
#定义一个全局变量
names1 = ['张三',‘李四',‘王五']
#调用函数
func(names1)
print(names1) # 选择题:A.[张三李四王五] B。[张三李四王五赵六]
czc:对于可变数据类型就不会受全局变量和局部变量作用于的影响,传入可变数据类型相当于新建一个变量指针指向那片内存空间,但是那个内存空间里的值是可修改的,所以可以直接修改,不用新开辟内存空间后修改指针,所以在局部作用域中可变数据类型的修改可以影响全局作用域
gpt纠正
对于可变数据类型(如列表、字典、集合等),当你在函数内部修改它们时,你实际上是在修改原始对象。这是因为可变对象可以被改变,所以不需要创建新的对象。即使在函数内部,你也是在操作同一个对象的引用。