python对象回收_python 对象引用,可变性,垃圾回收

本来不想总结,python这门语言学会简单,但是很多内部机值不容易理解,也不容易学会。使用过程中还是会有不少坑。推荐一个在线调试程序,可以看到对象内存视图的网站:

一. 对象引用

1.说一个我老大给我讲的,有点忘记了,大概意思是:动态语言和静态语言的最大区别,例如:a=1,在动态语言中,这个赋值语句中,就是把a这个变量贴到1这个int类型的值上面了,没有其他意义了;静态语言中,a这个变量其实还包含了右边的值的类型,在赋值过程中,变量a已经绑定了类型,右边赋值时必须满足左边变量绑定的类型,编译时检查类型。不知道可以这样理解不,python中赋值语句是右边先执行,而在静态语言中,例如golang中,是左边先执行。

2.python中的变量究竟是什么,python中应该把变量视作便利贴,类似于java里面的引用式变量,可以把她们理解为附加在对象上的标注,变量不是盒子。对于引用式变量来说,a=1,可以这样说,把变量a分配给1这个对象,这样更合理。为了理解python中赋值语句,应该始终先读右边,对象在右边创建或者获取,然后左边的变量才会绑定到对象上,就像为对象贴上标签。

3.每个变量都有标识(可以理解为对象在内存中的地址),类型,和值。对象一旦创建,他的标识绝对不会变,is运算符比较两个对象的标识,==比较两个对象的值,id()函数返回对象地址的整数标识。在对象和单例值比较时,应该用is,x is None 或者 x is not None。

4.说说元组的相对不可变性

元组的不可变性是指tuple数据结构的物理内容(保存的引用)不可变,与引用的对象无关,元组的不可变是指元素的标识(地址),元组的值会随着引用的可变对象变化而变。举个栗子:

t1 = (1,2,[30,50]),不可变指t1这个元组创建时,结构不会改变,里面元素的标识也不会变,但是当执行:t1[-1].append(99),然后t1的值已经改变了,t1的值现在变成 (1,2,[30,50,99])了

也就是说元组的不可变是相对不可变,不是绝对不可变,当元组的元素是一个可变对象时,元组的值会随着可变对象的改变而改变。

5.说说python的copy机制

1.python默认的是做浅复制

复制列表(或多数内置可变的集合,字典或者其他)最简单的方式是使用内置的类型构造方法,例如:l1=[2,[55,44],(7,8,9)], l2 = list(l1), 对于列表和其他可变序列还可以用l2 = l1[:]来创建副本。注意,字符串等不可变类型不适用,创建出来的副本仍是原来的那个对象,内存地址是一样的。使用这些方法复制出来的对象是浅复制,即复制了最外层的容器,副本中的元素是源容器中元素的引用。如果所有元素都是不可变的那么这样没有问题,但是,如果有可变元素,可能会导致对这个副本的元素做了改变,影响到其他副本。深复制会连同对源容器进行递归复制,相当于重新分配内存来把源容器的内容装下,python中的copy模块提供的copy和deepcopy能为任意对象做浅复制和深复制。

6.不要使用可变类型作为参数的默认值(重要)

先就这样吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值