gj7 对象引用、可变性和垃圾回收
7.1 python变量到底是什么
#python和java中的变量本质不一样,python的变量实质上是一个指针 int str, 便利贴 a = 1
a = "abc"
#1. a贴在1上面
#2. 先生成对象 然后贴便利贴 a = [1,2,3]
b = a
print (id(a), id(b))
print (a is b)
b.append(4)
print (a) ---
1642030876232 1642030876232
True
[1, 2, 3, 4]
7.2 ==和is的区别
is 判断是否是同一个对象,id是否相等
a = [1,2,3,4]
b = [1,2,3,4] print(a == b) # 判断值是否相等
print (id(a), id(b))
print (a is b) c=1
d=1
print(c is d) # 将一定范围的小整数,内存地址进行了复用
# ---
True
1642030933512 1642030785544
False
True --- class People:
pass person = People()
if type(person) is People:
print ("yes") type(person) ---
yes
__main__.People
7.3 del语句和垃圾回收
# cpython中垃圾回收的算法是采用 引用计数
# 当计数器减为0 就会被回收
a = object()
b = a
del a
print(b)
print(a) class A:
def __del__(self): # 当被回收的时候,执行下面的逻辑
pass
7.4 一个经典的错误
为了数据的安全性,使用tuple而不是list类型来存储
def add(a, b):
a += b
return a
a = 1
b = 2
c = add(a,b)
print(c)
print(a,b)
# ---
3
1 2
# ---传递进来的list受到了影响
a = [1,2]
b = [3,4]
c = add(a,b)
print(c)
print(a,b)
# ---
[1, 2, 3, 4]
[1, 2, 3, 4] [3, 4]
# ---
a = (1,2)
b = (3,4)
c = add(a,b)
print(c)
print(a,b)
---
(1, 2, 3, 4)
(1, 2) (3, 4)
---
class Company:
def __init__(self, name, staffs=[]):
self.name = name
self.staffs = staffs
def add(self, staff_name):
self.staffs.append(staff_name)
def remove(self, staff_name):
self.staffs.remove(staff_name) com1 = Company("com1", ["lewen1", "lewen2"])
com1.add("lewen3")
com1.remove("lewen1")
print("com1.staffs:",com1.staffs) com2 = Company("com2") # 使用了默认的[],list又是可变的对象
com2.add("lewen")
print(com2.staffs) print (Company.__init__.__defaults__) # 没有传递参数时,都使用默认的【】值 com3 = Company("com3") # 使用了默认的[],list又是可变的对象
com3.add("lewen5")
print (com2.staffs)
print (com3.staffs)
print (com2.staffs is com3.staffs)
# ---
com1.staffs: ['lewen2', 'lewen3']
['lewen', 'lewen5', 'lewen', 'lewen5', 'lewen', 'lewen5', 'lewen']
(['lewen', 'lewen5', 'lewen', 'lewen5', 'lewen', 'lewen5', 'lewen'],)
['lewen', 'lewen5', 'lewen', 'lewen5', 'lewen', 'lewen5', 'lewen', 'lewen5']
['lewen', 'lewen5', 'lewen', 'lewen5', 'lewen', 'lewen5', 'lewen', 'lewen5']
True
-
gj7 对象引用、可变性和垃圾回收的更多相关文章
- 流畅的python 对象引用 可变性和垃圾回收
对象引用.可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量.Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加 ...
- 流畅的python第八章对象引用,可变性和垃圾回收
变量不是盒子 在==和is之间选择 ==比较两个对象的值,而is比较对象的标识 元组的相对不可变姓 元组与多数的python集合(列表,字典,集,等等)一样,保存的是对象的引用.如果引用的元素是可变的 ...
- 基于Python对象引用、可变性和垃圾回收详解
基于Python对象引用.可变性和垃圾回收详解 下面小编就为大家带来一篇基于Python对象引用.可变性和垃圾回收详解.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. 变量不是盒子 在示例所示 ...
- Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收
第四部分第8章,对象引用.可变性和垃圾回收 1. 创建对象之后才会把变量分配给对象 变量是对象的标注,是对象的别名,是对象的引用,并不是对象存储的地方. 例子1. 证明赋值语句的右边先执行 class ...
- PythonI/O进阶学习笔记_6.对象引用,可变性和垃圾回收
前言: 没有前言了- -......这系列是整理的以前的笔记上传的,有些我自己都忘记我当时记笔记的关联关系了. 记住以后 笔记记了就是用来复习的!!!不看不就啥用没了吗!!! content: 1.p ...
- Python 对象引用、可变性和垃圾回收
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 变量不是盒子 在示例所示的交互式控制台中,无法使用"变量是盒 ...
- Python进阶:set和dict/对象引用、可变性和垃圾回收/元类编程/迭代器和生成器
frozenset:不可变集合,无序,不重复 dict上的特性: 1. dict的key或者set的值 都必须是可以hash的(不可变对象 都是可hash的, str, fronzenset, tup ...
- Python对象的引用、可变性和垃圾回收
1.标识.相等性和别名 别名的例子 >>> charles = {'name': 'Charles L. Dodgson', 'born': 1832} >>> l ...
- 类装饰器,元类,垃圾回收GC,内建属性、内建方法,集合,functools模块,常见模块
'''''''''类装饰器'''class Test(): def __init__(self,func): print('---初始化---') print('func name is %s'%fu ...
随机推荐
- windows installer 应用变换时的错误.请验证指定的变换路径是否有
安装Windows Installer Clean Up 清理一下残留的项目之后再装或者手动去注册表找 HKEY_CLASSES_ROOT\Installer\Products\ 下面的"子 ...
- 移动cup
intel处理器M和U H结尾的有什么具体区别 笔记本CPU 酷睿i 系列U M H详解: U 低压版(低电压-性能消减)最低主频:1.7-1.9GHZ M 准电压(笔记本上的电压标准)最低主频:2. ...
- memcache命令
Command Description Example get 读取键值 get mykey set 设置新键值 set mykey 0 60 5 add 新增键值 add newkey 0 60 5 ...
- 迷你MVVM框架 avalonjs 学习教程15、属性监听与模块通信
avalon的ViewModel对象从其内部EventManager里继承了三个方法,$watch.$unwatch.$fire三个方法,它们就是我们本节的主题. 词如其名,非常直白,一看就知道做什么 ...
- FastDFSClient工具类 文件上传下载
package cn.itcast.fastdfs.cliennt; import org.csource.common.NameValuePair; import org.csource.fastd ...
- 查询中mybatis的if判断里传入0
1.传入的是long 或者 Integer类型 ,<if test="id != null "> 但是id传值为0时(前提是id对应的类型为long 或者 Intege ...
- Windows平台下Flutter安装,配置,初运行。
Flutter是什么?他是谷歌根据Dark语言开源的跨平台开发依赖.和目前比较火的Reactive Native一样,一套代码能够实现两个不同平台的App.那么为什么要介绍Flutter而不是在国内大 ...
- Windows内置系统账户:Local system/Network service/Local Service 区别
LocalSystem 账户 LocalSystem是预设的拥有本机所有权限的本地账户,这个账户跟通常的用户账户没有任何关联,也没有用户名和密码之类的凭证.这个服务账户可以打开注册表的HKEY_LO ...
- JPA报错, java.lang.NullPointerException
java.lang.NullPointerException 我觉得这应该是一个很常见的错误, 数据库没取到数据嘛, 很正常, JPA没取到数据就是会抛出空指针异常, 但是就是这么简单的一个错误也让我 ...
- ubuntu下安装.deb包的安装方法
ubuntu16.04的软件中心应该是有bug,安装不了第三方.deb文件,我们只有使用dpkg -i 或者gdebi的方式安装,我使用的是后者,因为后者功能更加强大.要使用gdebi命令先要安装它: ...