bar函数 python_Python可变和不可变对象Mutation

3756de72fa2bd0a170d59c3ebb5ba96a.png

最近再复习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是同一个变量,指向
#同一个地址,只是两个不一样的名字

eccc8f9525d46fbb6f40730b61ca0e5d.png
借图演示,可变对象本质是一个内容的两个名字,都指向同一个内容

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

#通过打印内存地址,可见两个变量内存地址不一样,输出的内容也不同

0aeade64cb75a66e6b7963d193a1b58d.png
不可变对象本质是两个不同的名字指向两个不同的内容,即不同的内存地址

参考

  1. ^https://www.debugger.wiki/article/html/1590312963801293
  2. ^https://www.jianshu.com/p/c5582e23b26c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值