课时13:可变对象

简介: 可变对象是指其值可以在创建后被修改的对象。每个对象包含三个属性:Id(标识)、Type(类型)和Value(值)。其中,只有Value是可变的。例如,列表是典型的可变对象,可以通过索引修改其元素。通过代码演示和图示,本文详细解释了如何区分修改对象与修改变量的区别及其影响。修改对象时,所有指向该对象的变量都会受到影响;而修改变量则仅影响该变量本身,不会影响其他变量。总结来说,赋值操作通常修改变量,而通过索引或方法修改内容的操作则修改对象。

可变对象

 

摘要 

1.可变对象的定义与组成

2.列表演示

3.列表中的对象与变量

 

01.可变对象的定义与组成

1.1可变对象的定义与组成

可变对象指的是对象的值可变。

每个对象中都保存了三个数据:Id(标识)Type(类型)Value(值)

先回顾一下之前画的图:

image.png

图中 Id Type 的对象是不可变的,唯一能改变的是 Value,但是仅限于是可变对象。像数字、字符串、Bool 值等的 Value 值是不可变的,但是可变对象是可以改变的,比如列表就是一个可变对象。

 

02.列表演示

 

2.1列表演示

列表是一个可变对象。

a=[1,2,3]

例如,a=[1,2,3]用图体现出来,如下:

a 是变量,[1,2,3]是 a 的对象,对象需要在内存里专门开辟出一块区域去保存这个对象。

先插入一块儿区域,在该区域里设置三个数据,IdTypeValue

Id 假设为0x111Type 类型为 Class List,因为是一个列表。

Value 为[1,2,3]。如下图:

image.png

这里 Value 属于简写了,若详细去写,结构会稍复杂一些。先用这种结构方式来变现一下。变量 a 里有保存它的 Id 地址,所以第一个值是 0x111,就相当于变量里有一个指针指向内存对象。如图:

image.png

图中 Value 的值是可变的。

 

03.列表中的对象与变量

 

3.1修改对象

为体现出可变对象,现在做一个代码演示一下:

a=[1,2,3]
a[0]=10

这个时候再执行,如下:

image.png

再次用图演示,这里把索引为 0 的值改为了 10 ,这里通过变量找到对象修改了对象当中索引为 0 的那个值,所以这里改的是 Value=[10,2,3]这个位置。因为对象 Value 值被改变了,所以这就是可变对象。

image.png

可变对象指的是对象里的 Value 可以被改变。

 

3.2修改变量

如果直接写:

a=[4,5,6]
a
[4,5,6]

这两种方式是不一样的,因为

image.png

这种方式是在修改对象,而

image.png

这种方式是直接改这个变量。

如果写的是 a=[4,5,6],实际上这个是一个新的列表,既然是新的列表那么就要创建新的对象。那么在内存里就应该这样体现的,新的对象改一个新的地址,Id为0x211,那么 a 里面的值变为 0x211,如图:

image.png

这个 a=[4,5,6]操作并没有对 a=[10,2,3]产生影响,因为现在是创立的一个新的对象,然后赋值给a。

 

3.3改对像和改变量的作用

a[0]= 10(改对象)

这个操作是在通过变量去修改对象的值所以这种操作不会改变变量所指向的对象当去修改对象时,如果有其他变量也指向了该对象,则修改也会在其他的变量中体现

a=[456](改变量 )

这个操作是在给变量重新赋值这种操作会改变变量所指向的对象

为一个变量重新赋值时,不会影响其他的变量

 

3.4改对像和改变量的区别

接下来演示二者区别:

#可变对象
a = [1,2,3]
print( ' 修改前: ', a  ,id(a))

紧接着执行,如图:

image.png

接下来继续添加:

# 通过索引修改列表

a[0]= 10

print( ' 修改: 'a  id(a))

再次执行如图:

image.png

这时会发现 Id 并没有改变。只是对象里的值变了,对象不变。所以通过索引修改的,它是在修改对象。

#为变量重新赋值
a=[4,5,6]
print( ' 修改后: ', a  ,id(a))

image.png

执行后发现 Id 改变,值发生改变,但生成的是一个新的对象。

所以,改对象的时候,变量中保存的内存地址是不会变的。而在改变量的时候它实际上是给变量重新赋值了。

 

3.5改对象与改变量的影响

l 用代码演示

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

编译执行后,如图:

image.png

接下来添加一步,b[0]=10,通过索引把 0 改成 10,如下:

a=[1,2,3]
b=a
b[0]=10
print(“a”, a, id(a))
print(“b”, b, id(b))

编译执行后,如图:

image.png

结论:当我们去修改对象时,如果有其他变量也指向了该对象,则修改也会在其他的变量中体现

l 用图演示

为更好的理解这个结论,可以通过下面的图来体现:

当a=[1,2,3],b=a时,ab指向的是同一个对象。

现在通过索引 0 来修改对象值,修改后,a b 还是同一个指向。

image.png

接下来直接将 b=[10,2,3],如下所示:

a=[1,2,3]
b=a
b=[10,2,3]
print(“a”, a, id(a))
print(“b”, b, id(b))

这个时候 a 不变,因为在给变量重新赋值的时候,是不会影响其他变量的。

将上述代码编译执行后,如图:

image.png

这时的 Id 不一样了。

结论:为一个变量重新赋值时,不会影响其他的变量。可以通过下面的图来体现:

当 a=[123],b=ab=[1023]时,说明 b=[1023]是一个新的列表,那么新的列表就意味着要创建一个新的对象。

image.png

这个操作不会对 a 有任何影响,因为我们是在给 b 变量重新赋值,对 a 没有影响。如果改对象的时候就会影响了,但是现在改对象影响不了,因为现在是属于两个对象了。

所以,改对象的时候如果别的变量也指向这个对象,会对那些变量也产生影响。而改变量是只影响本身,不会影响到其他变量。

 

3.6如何区别是改对象、改变量

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

例如:一般看到(a=…)之类的是改变量,而(a[..]=…)之类的大部分都是改对象。

相关文章
|
3月前
|
人工智能 Linux API
完整版OpenClaw(龙虾)安装与使用指南|阿里云+本地全平台部署+千问/Coding Plan配置+Skills接入教程
OpenClaw(圈内昵称“龙虾”)是2026年最受关注的开源自动化AI智能体框架,凭借**本地优先、自动执行、长期记忆、主动干活**四大核心能力,彻底区别于传统被动式聊天AI。它可以自主操作浏览器、控制桌面、执行任务、7×24小时运行,并通过向量记忆越用越懂你,真正成为能帮你创造收益、节省时间的数字员工。
3218 5
|
存储 Java 大数据
Spring Boot 2.x :通过 spring-boot-starter-hbase 集成 HBase
HBase 是在 Hadoop 分布式文件系统(简称:HDFS)之上的分布式面向列的数据库。而且是 2007 最初原型,历史悠久。 那追根究底,Hadoop 是什么?Hadoop是一个分布式环境存储并处理大数据。本文介绍通过 spring-boot-starter-hbase 集成 HBase。
14128 0
|
9月前
|
存储 JSON 数据管理
Python字典:高效数据管理的瑞士军刀
Python字典基于哈希表实现,提供接近O(1)的高效查找,支持增删改查、遍历、合并等丰富操作,广泛应用于计数、缓存、配置管理及JSON处理。其灵活性与性能使其成为数据处理的核心工具。
756 0
|
存储 监控 物联网
|
存储 监控 NoSQL
TDengine 3.3.3.0 版本上线:优化监控、增强 MongoDB 支持
今天我们非常高兴地宣布,TDengine 3.3.3.0 版本正式发布。本次更新引入了多项重要功能和性能优化,旨在为用户提供更高效、更灵活的数据解决方案。
473 0
|
存储 固态存储 前端开发
计算机中主板与总线
【7月更文挑战第28天】
806 1
|
机器学习/深度学习
精确率和召回率
精确率和召回率
1481 2
|
存储 运维 分布式计算
HDFS 如何容错?
【8月更文挑战第31天】
871 0
|
机器学习/深度学习 自然语言处理 PyTorch
Transformer 自然语言处理(一)
Transformer 自然语言处理(一)
817 0
Transformer 自然语言处理(一)

热门文章

最新文章