变量:是一个系统表的元素,拥有指向对象的连接空间
对象:被分配的一块内存,存储其所代表的值
引用:是自动形成的从变量到对象的指针
类型:属于对象,而非变量
不可变对象:一旦创建就不可修改的对象,包括数值类型、字符串、布尔类型、元组
(该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。)
可变对象:可以修改的对象,包括列表、字典、集合
(该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的地址,通俗点说就是原地改变。)
例如:
a=[1,2,3]
print(id(a)) # a的内存地址
b=a
a.append(4) # 修改a列表的值
print(id(b)) # b的内存地址
print(b)
打印出来的结果一模一样,由此可知普通的赋值只是复制了新对象的引用,并不会开辟新的内存空间,而且单独修改a还会影响b。
如果想让两个变量的值完全分开,不会相互影响的话就得用到浅拷贝,浅拷贝的用法如下所示:
import copy
a=[1,2,3]
print(id(a)) # a的内存地址
b=copy.copy(a) # b对a进行浅拷贝
a.append(4) # 修改a列表的值
print(id(b)) # b的内存地址
print(b)
import copy
a=[1,2,3,[4,5]]
print(id(a)) # a的内存地址
b=copy.copy(a) # b对a的浅拷贝
a[3].append(6) # 修改内层的值
print(id(b)) # b的内存地址
print(b)
print(id(a[3])) # a内层数据的内存地址
print(id(b[3])) # b内层数据的内存地址
从打印结果上可以得知,浅拷贝并不会赋值内层对象的值,而是对内层对象的应用,并不会开辟新的内层空间。