可变对象
摘要
1.可变对象的定义与组成
2.列表演示
3.列表中的对象与变量
01.可变对象的定义与组成
1.1可变对象的定义与组成
可变对象指的是对象的值可变。
每个对象中都保存了三个数据:Id(标识)、Type(类型)、Value(值)
先回顾一下之前画的图:
图中 Id 和 Type 的对象是不可变的,唯一能改变的是 Value,但是仅限于是可变对象。像数字、字符串、Bool 值等的 Value 值是不可变的,但是可变对象是可以改变的,比如列表就是一个可变对象。
02.列表演示
2.1列表演示
列表是一个可变对象。
a=[1,2,3]
例如,a=[1,2,3]用图体现出来,如下:
a 是变量,[1,2,3]是 a 的对象,对象需要在内存里专门开辟出一块区域去保存这个对象。
先插入一块儿区域,在该区域里设置三个数据,Id、Type、Value。
Id 假设为0x111,Type 类型为 Class List,因为是一个列表。
Value 为[1,2,3]。如下图:
这里 Value 属于简写了,若详细去写,结构会稍复杂一些。先用这种结构方式来变现一下。变量 a 里有保存它的 Id 地址,所以第一个值是 0x111,就相当于变量里有一个指针指向内存对象。如图:
图中 Value 的值是可变的。
03.列表中的对象与变量
3.1修改对象
为体现出可变对象,现在做一个代码演示一下:
a=[1,2,3] a[0]=10
这个时候再执行,如下:
再次用图演示,这里把索引为 0 的值改为了 10 ,这里通过变量找到对象修改了对象当中索引为 0 的那个值,所以这里改的是 Value=[10,2,3]这个位置。因为对象 Value 值被改变了,所以这就是可变对象。
可变对象指的是对象里的 Value 可以被改变。
3.2修改变量
如果直接写:
a=[4,5,6] a [4,5,6]
这两种方式是不一样的,因为
这种方式是在修改对象,而
这种方式是直接改这个变量。
如果写的是 a=[4,5,6],实际上这个是一个新的列表,既然是新的列表那么就要创建新的对象。那么在内存里就应该这样体现的,新的对象改一个新的地址,Id为0x211,那么 a 里面的值变为 0x211,如图:
这个 a=[4,5,6]操作并没有对 a=[10,2,3]产生影响,因为现在是创立的一个新的对象,然后赋值给a。
3.3改对像和改变量的作用
a[0]= 10(改对象)
这个操作是在通过变量去修改对象的值,所以这种操作不会改变变量所指向的对象,当去修改对象时,如果有其他变量也指向了该对象,则修改也会在其他的变量中体现。
a=[4,5,6](改变量 )
这个操作是在给变量重新赋值,这种操作会改变变量所指向的对象
为一个变量重新赋值时,不会影响其他的变量。
3.4改对像和改变量的区别
接下来演示二者区别:
#可变对象 a = [1,2,3] print( ' 修改前: ', a ,id(a))
紧接着执行,如图:
接下来继续添加:
# 通过索引修改列表
a[0]= 10
print( ' 修改后: ', a ,id(a))
再次执行如图:
这时会发现 Id 并没有改变。只是对象里的值变了,对象不变。所以通过索引修改的,它是在修改对象。
#为变量重新赋值 a=[4,5,6] print( ' 修改后: ', a ,id(a))
执行后发现 Id 改变,值发生改变,但生成的是一个新的对象。
所以,改对象的时候,变量中保存的内存地址是不会变的。而在改变量的时候它实际上是给变量重新赋值了。
3.5改对象与改变量的影响
l 用代码演示
a=[1,2,3] b=a print(“a”, a, id(a)) print(“b”, b, id(b))
编译执行后,如图:
接下来添加一步,b[0]=10,通过索引把 0 改成 10,如下:
a=[1,2,3] b=a b[0]=10 print(“a”, a, id(a)) print(“b”, b, id(b))
编译执行后,如图:
结论:当我们去修改对象时,如果有其他变量也指向了该对象,则修改也会在其他的变量中体现
l 用图演示
为更好的理解这个结论,可以通过下面的图来体现:
当a=[1,2,3],b=a时,a和b指向的是同一个对象。
现在通过索引 0 来修改对象值,修改后,a 和 b 还是同一个指向。
接下来直接将 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 不变,因为在给变量重新赋值的时候,是不会影响其他变量的。
将上述代码编译执行后,如图:
这时的 Id 不一样了。
结论:为一个变量重新赋值时,不会影响其他的变量。可以通过下面的图来体现:
当 a=[1,2,3],b=a,b=[10,2,3]时,说明 b=[10,2,3]是一个新的列表,那么新的列表就意味着要创建一个新的对象。
这个操作不会对 a 有任何影响,因为我们是在给 b 变量重新赋值,对 a 没有影响。如果改对象的时候就会影响了,但是现在改对象影响不了,因为现在是属于两个对象了。
所以,改对象的时候如果别的变量也指向这个对象,会对那些变量也产生影响。而改变量是只影响本身,不会影响到其他变量。
3.6如何区别是改对象、改变量
一般只有在为变量赋值时才是修改变量,其余的都是修改对象
例如:一般看到(a=…)之类的是改变量,而(a[..]=…)之类的大部分都是改对象。