python精讲 不可变对象与可变对象

文章目录

  • 对象
  • 可变对象与不可变对象
    • 可变对象
    • 不可变对象

对象

Python 中的变量不是装有对象的“容器”,而是贴在对象上的“标签”。
真正的存贮位置是内存中

python精讲 不可变对象与可变对象_第1张图片

  • 在python中,可变对象包括:list、set、dict、自定义对象;
  • 不可对对象包括:int、float、str、bool、tuple等。
  • 不可变对象步允许自身内容进行修改。如果我们队一个不可变对象进行赋值,实际上是生成一个新对象,再让变量指向这个对象。哪怕这个对象简单到只是数字0和1

每个对象在内存中都会存储三个数据:
1.id(标识)
2.type(类型)
3.value(值)

可变对象与不可变对象

可变对象

而可变对象即指在对象不改变的前提下让对象的数据发生改变
即值发生改变但是 对象 未发生改变,例如 标识id 不会发生改变

a = [1,2,3]
print('修改前',a,id(a))
a[0] = 4  #改变了值
print('修改后',a,id(a))  #但是id未变
修改前 [1, 2, 3] 1221617771648
修改后 [4, 2, 3] 1221617771648

对象没有发生改变而值发生改变
python精讲 不可变对象与可变对象_第2张图片

重新赋值则开辟新的内存块存储新的值,顶替原来的对象和值
python精讲 不可变对象与可变对象_第3张图片

a = [1,2,3]
print('修改前',a,id(a))
a = [2,3,4]  #重新赋值即重新建立一个a,所以这个a不是原来的a,
             #而是新生的a
print('修改后',a,id(a))  #所以内存中重新开辟空间,对象发生改变
修改前 [1, 2, 3] 2057897038528
修改后 [2, 3, 4] 2057897038720

因为对象不可变,所以为了提高效率,Python 会使用一些公用的对象:

a = 1
print('a', id(a))
b = 1
print('b', id(b))
print(a == b)
print(a is b)
c = 'hello world'
print('c', id(c))
d = 'hello world'
print('d', id(d))
print(c == d)
print(c is d)

输出:

a 4423761776
b 4423761776
True
True
c 4430180912
d 4430180912
True
True

这里顺便提一下 is 这个操作符。它和 == 的区别在于:== 只判断“值”是不是相等,而 is 则判断是否为同一个对象,也就是地址一致。比如:

a = 2
b = 2.0
print(a == b)
print(a is b)

输出:

True
False

不可变对象

不可变对象不允许对自身内容进行修改。如果我们对一个不可变对象进行赋值,实际上是生成一个新对象,再让变量指向这个对象。:
即重新赋值

a = 0
print('a', id(a))
a = 1
print('a', id(a))

输出:

a 4463151440
a 4463151472

python精讲 不可变对象与可变对象_第4张图片

你可能感兴趣的:(python,对象,可变对象,不可变对象)