python可变对象和不可变对象

note

    • python一切皆对象
    • 不可变对象
    • 可变对象
    • 关于内存的注意事项

python一切皆对象

0、数字、list、tuple、dict、file皆是对象;类也是一个对象,类是元类的实例;函数也是对象
1、对象是在内存中实实在在的,在内存中有一个地址存放它的内容。
2、引用可以理解成对这个对象的地址,或者这个对象的名字。
3、对于一个对象而言,首先应该是具备类型这一属性,还有该类型对应的,由于对象都是在内存中生存的,所以它也应该拥有一个地址
因此,作为一个对象,他会有以下三个属性:
类型 type

地址 id
4、dir(对象)可以查看该对象的所有可操作的属性和方法

a = 100
b = '100'
c = [100]

print(a, type(a), id(a))
print(b, type(b), id(b))
print(c, type(c), id(c))

'''output:
100  94791606904448
100  140367588834864
[100]  140367623428936
'''

不可变对象

该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
不可变(immutable):int、字符串(str)、float、(数值型number)、元组(tuple)、None(空)

a = b =1000
print(a is b) #id(a) == id(b)
a = 2000
print(a is b)
print(a)
print(b)

'''output
True
False
2000
1000
'''

可变对象

该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。
可变(mutable):字典型(dictionary)、列表型(list), set(集合)

a = b = [1, 2, 3]
print(a is b) #id(a) == id(b)
a[0] = 4
print(a is b)
print(a)
print(b)
'''output
True
True
[4, 2, 3]
[4, 2, 3]
'''

关于内存的注意事项

对于[-5,255]内的整数和单字符的字符串在python启动的时候就会创建好对象,因此a=2和b=2实际都只有一个对象2(节省了内存申请和释放的开销)对于大整数都是实时创建和销毁的,如果要长期保存大整数会有内存问题,事实上python中整数对象池是只增不减的。如果代码运行到某一时刻同时存在成千上万的整数对象,那么之后即使不用了,内存也会居高不下,这点在数值计算时需要特别注意。

a = 5
b = 5
c = -6
d = -6
print(a is b)
print(c is d)
'''output:
True
False
'''

你可能感兴趣的:(Python)