python中可变对象和不可变对象
不可变对象: 对象所指向的内存中的值不能被改变,当改变这个变量的时候,原来指向的内存中的值不变,变量不再指向原来的值,而是开辟一块新的内存,变量指向新的内存。
数值类型int 、float
、 字符串str
、元祖tuple、boole
都是不可变对象。
可变对象: 对象指向的内存中的值会改变,当更改这个变量的时候,还是指向原来内存地址中的值,并且在原来的内存地址值进行原地修改,并没有开辟新的内存。
基本只有列表list
、集合set
、字典dict
是可变对象。
python中的赋值
python赋值的实质:把要赋值对象的“地址”赋给变量名,而不是直接把复制内容“直接装进”变量名中(变量和列表都是一样的)。
python赋值的流程:1.先为等式右边(待赋值对象)开辟内存空间(即使右边是相同的内容,两次的地址也不一样) 2.把内存的地址(列表则是首地址)赋给变量名。
注意:这里等式右边必须是实实在在的“常量”(直接打出的常数,字符串,列表等),而不是两个变量(等号左右都是变量称为浅复制,不是赋值)
python中“=” 赋值的本质: 把右侧的地址(或首地址)赋给左侧。如果右侧没有地址(常量或者直接打出的列表等),则为其开辟一个新的内存空间,再把地址赋给左侧。
python的“浅复制”:用“=”给两个“同类对象”赋值就是“浅复制”,浅复制只是把右边变量的地址给了左边变量,二者指向的仍然是同一处内存空间。即实际上完全是一个东西(不独立),在不改变地址的情况下,一个变另外一个也会跟着变。
变量和列表的浅复制:
对于变量来说,是不是浅复制完全没有太大区别,因为不存在改变变量值而不改变其地址的情况(变量值变则地址必然变,即使是a+=1这种)。
对于列表则完全不同,append(item)等方法可以在不改变首地址的情况下更改列表内容(在不变的首地址后改变或增加新的内存空间),这时新老列表会一起改变,但不到复制的目的,因此称为浅复制。
"""对变量的赋值"""
old_variable = 1
new_variable = old_variable
print(id(old_variable), id(new_variable)) # 二者地址相同,完全为一个变量
new_variable = 10 # 此时,系统会给10开辟一个新地址,然后赋给new_variable,此时地址改变
print(old_variable, new_variable) # 二者地址已经不同,互相独立
print(id(old_variable), id(new_variable))
--------------------------