可变对象和不变对象
可变对象是指,一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值;
不可变对象是指,一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址。
参考: https://www.cnblogs.com/xiaxiaoxu/p/9742452.html
可变对象与不可变对象的区别在与可变对象可以修改变量的值(即修改变量的值后,内容变了,变量地址不变),而不可变对象修改变量的值后,地址也会变化.
区别:1不变对象可以作为dict的key,而可变对象不行,如list不可作为key,但tuple可以
不可变对象:
# 性质1 # python不可变对象有number str tuple,除了tuple外,有时候内容一样地址就一样https://www.jianshu.com/p/b3157c9751d0 a = 1 print(id(a)) b = 1 print(id(b)) c = a + 0 print(id(c)) p = (1,2,3) q = (1,2,3) # tuple不具有这一性质 print(id(p)) print(id(q)) # 9289312 # 9289312 # 9289312 # 140232056227664 # 140232056227808 # 性质2 # 如下当改变i的值后,内存空间中原先的3会被python的垃圾收集机制自动回收掉, # 计算出的结果5会开辟新的空间来存放,i中存放这个新内容的地址,如果计算结果是2,则地址不会变 i = 3 print(id(i)) i = 3 + 2 print(id(i)) # 9289376 # 9289440 # s执行replace后把里面的“a”换成了“A“相当于创建的新的地址存放”Abc“,s中仍然是abc,返回的是新的内容 # m排序后,m中的值变了,返回是空 # 可见对不可变对象而言,调用它的方法,只会返回一个新对象,原先的对象不变 # 而对可变对象而言,是在原有的对象上直接修改的,返回值为空 s = 'abc' s1 = s.replace('a','A') print('s', s) print('s1', s1) m = [11,2,3] m1 = m.sort() print('m', m) print('m1', m1) # s abc # s1 Abc # m [2, 3, 11] # m1 None