Python中的可变对象

可变对象与不可变对象

关于什么是对象不是这篇的重点,可查看这篇

Python中面向对象的简单应用

可变对象就是说对象的值是可以改变的,序列中可变对象有list 不可变对象有str、tuple

那么问题又来了,什么是序列?

  • 序列是Python中最基本的一种数据结构
  • 数据结构其实就是数据在计算机中的存储方式
  • 序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索引);并且序列中的数据会按照添加的顺序来分配索引

关于对象

对象在内存中的存储保存了三个数据

  • id(标识)即内存地址,相当于C语言的指针
  • type(类型)即数据类型,int、str、bool、float等…
  • value(值) 即对象存储的内容,就是值

整形对象123,字符对象hello在内存中的数据结构如下图

在这里插入图片描述
而将对象赋值给变量就相当于将对象的值设定为对象的id,即内存地址,也就是指针
在这里插入图片描述

图解可变对象

list类型就是可变对象,即可以随意修改其索引对应的值,即对象的id、type是没有发生变化,改变的只是对象的值

a = [1,2,3]
print('修改前的a =',a,id(a))
a[0] = 2
print('第一次修改后的a =',a,id(a))
a = [4,5,6]
print('第二次修改后的a =',a,id(a))

执行结果
修改前的a = [1, 2, 3] 2326392234632
第一次修改后的a = [2, 2, 3] 2326392234632
第二次修改后的a = [4, 5, 6] 2326392740424

在这里插入图片描述在这里插入图片描述

扫描二维码关注公众号,回复: 13122091 查看本文章

如果在指定一个变量指向这个0x111,那么这个修改这个变量的值会发生什么变化呢?

a = [1,2,3]
print('a =',a,id(a))
b = a
print('b =',b,id(b))

#修改变量b的值
b[0] = 2
print('修改后的b =',b,id(b))

执行结果
a = [1, 2, 3] 1979100914312
b = [1, 2, 3] 1979100914312
修改后的b = [2, 2, 3] 1979100914312

可见,会同时修改之前变量a的指向,这是因为a与b指向的是同一块内存空间

在这里插入图片描述

总结:

  • a[0] = 2 (改对象)

    • 这个操作是在通过变量去修改对象的值
    • 这种操作不会改变变量所指向的对象 (如上图所示)
    • 当去修改对象时,如果有其他变量也指向了该对象,则修改也会在其他的变量中体现
  • a = [4,5,6] (改变量)

    • 这个操作是在给变量重新赋值
    • 这种操作会改变变量所指向的对象
    • 为一个变量重新赋值时,不会影响其他的变量

一般只有在为变量赋值时才是修改变量,其余的都是修改对象

猜你喜欢

转载自blog.csdn.net/qq_41959899/article/details/111689350