最近再复习python进阶,又看到了python可变和不可变对象这对名词。
定义:
Python中一切皆对象,每个对象都有其唯一的id,对应的类型和值,其中id指的是对象在内存中的位置。根据对象的值是否可修改分为可变对象和不可变对象[1]。其中,
可变对象包括:list,dict,set
------对象存放在地址中的值不会被改变(所谓的改变是创建了一块新的地址并把新的对象的值放在新地址中原来的对象并没有发生变化)[2]
不可对象包括:数字,字符串,tuple
------对象存放在地址中的值会原地改变
代码验证:
1 id 函数的引进, id函数可以获取变量的内存地址
foo = ['hi']
print("foo id :",id(foo))
#foo id : 140362527318096
2 可变对象的演示
foo = ['hi']
# list 是可变对象
bar = foo
# bar 拷贝了 list
bar += ['bye']
print(foo is bar)
#True
#is 函数验证的是两个变量的内存地址是否相同
print("foo id :", id(foo), foo)
# foo id : 140387610034080 ['hi', 'bye']
print("bar id :", id(bar), bar)
# bar id : 140387610034080 ['hi', 'bye']
#通过打印两个参数的内存地址,进一步验证了foo 和 bar是同一个变量,指向
#同一个地址,只是两个不一样的名字
3 不可变对象的演示
tuple_foo = ('hi')
#tuple 元组是不可变对象
tuple_bar = tuple_foo
#tuple_bar拷贝了tuple_bar,如果和list一样
#内存地址通过 is 函数验证应该返回True
tuple_bar += ('bye')
print(tuple_foo is tuple_bar)
#False
#经过验证,两个变量的内存地址不同
print("tuple_foo id :", id(tuple_foo), tuple_foo)
# tuple_foo id : 140362412483888 hi
print("tuple_bar id :", id(tuple_bar), tuple_bar)
# tuple_bar id : 140362528259760 hibye
#通过打印内存地址,可见两个变量内存地址不一样,输出的内容也不同
参考
- ^https://www.debugger.wiki/article/html/1590312963801293
- ^https://www.jianshu.com/p/c5582e23b26c