课时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小时运行,并通过向量记忆越用越懂你,真正成为能帮你创造收益、节省时间的数字员工。
3088 5
|
7月前
|
JSON API 数据格式
详细说明--如何使用postman调试【阿里云身份证实名认证API接口】
本文介绍如何使用Postman开发实名认证服务。通过阿里云市场获取接口,购买免费套餐后在控制台获取AppCode,在Postman中设置请求地址、Authorization头(含APPCODE),并以x-www-form-urlencoded格式提交参数,发送请求即可获得JSON格式认证结果,调试错误可查看返回Header,成功后可导出源码。(239字)
596 10
|
8月前
|
存储 缓存 JSON
商品图片批量上传接口设计与实现
本文介绍如何使用Python Flask实现商品图片批量上传接口,涵盖设计、验证、存储及错误处理。支持多文件上传、格式大小校验,并提供完整代码与性能优化方案,助力电商或CMS系统高效管理图片。
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
|
数据可视化
GTD时间管理模型是什么
本文介绍GTD(Getting Things Done)时间管理方法,通过收集、整理、组织、回顾、执行五个步骤,帮助你清空大脑内存,减轻焦虑,提升专注力和生产力,轻松应对挑战,改善工作和生活质量。
494 7
GTD时间管理模型是什么
|
人工智能 API 知识图谱
使用SiliconCloud尝试GraphRag——以《三国演义》为例(手把手教程,适合小白)
本文介绍了使用不同模型和平台体验GraphRAG的过程。首先通过OpenAI的GPT-4O Mini模型对沈从文的《边城》进行了分析,展示了如何安装GraphRAG并配置参数,最终实现了对文本的有效查询。随后,文章探讨了在国内环境下使用SiliconCloud作为替代方案的可能性,以《三国演义》为例,演示了使用SiliconCloud模型进行相同操作的步骤。此外,还讨论了使用本地模型如Ollama和LM Studio的可能性,尽管受限于硬件条件未能实际运行。最后,提出了混合使用在线对话模型API与本地或在线嵌入模型的方法,并列举了一些能够使GraphRAG流程跑通的大模型。
937 10
使用SiliconCloud尝试GraphRag——以《三国演义》为例(手把手教程,适合小白)
|
安全 数据安全/隐私保护
数字证书的主要作用是什么?
【5月更文挑战第11天】数字证书的主要作用是什么?
1640 2
|
缓存 数据处理 Python
python读取文件到缓存
python读取文件到缓存
415 2
|
存储 运维 安全
阿里云技术专家刘晨旭:阿里云对数据可靠性保障的一些思考
互联网时代的数据重要性不言而喻,任何数据的丢失都会给企事业单位、政府机关等造成无法计算和无法弥补的损失,尤其随着云计算和大数据时代的到来,数据中心的规模日益增大,环境更加复杂,云上客户群体越来越庞大,从而造成硬件故障、软件失效等错误发生的频率也在猛增,任何架构和流程上的疏漏都可能会造成大面积的数据丢失。
4169 0
|
JSON JavaScript 前端开发
如何在Python中解析JSON响应?
【2月更文挑战第26天】【2月更文挑战第92篇】如何在Python中解析JSON响应?
579 0