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 对象引用、可变性和垃圾回收的更多相关文章

  1. 流畅的python 对象引用 可变性和垃圾回收

    对象引用.可变性和垃圾回收 变量不是盒子 人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量.Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加 ...

  2. 流畅的python第八章对象引用,可变性和垃圾回收

    变量不是盒子 在==和is之间选择 ==比较两个对象的值,而is比较对象的标识 元组的相对不可变姓 元组与多数的python集合(列表,字典,集,等等)一样,保存的是对象的引用.如果引用的元素是可变的 ...

  3. 基于Python对象引用、可变性和垃圾回收详解

    基于Python对象引用.可变性和垃圾回收详解 下面小编就为大家带来一篇基于Python对象引用.可变性和垃圾回收详解.小编觉得挺不错的,现在就分享给大家,也给大家做个参考. 变量不是盒子 在示例所示 ...

  4. Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收

    第四部分第8章,对象引用.可变性和垃圾回收 1. 创建对象之后才会把变量分配给对象 变量是对象的标注,是对象的别名,是对象的引用,并不是对象存储的地方. 例子1. 证明赋值语句的右边先执行 class ...

  5. PythonI/O进阶学习笔记_6.对象引用,可变性和垃圾回收

    前言: 没有前言了- -......这系列是整理的以前的笔记上传的,有些我自己都忘记我当时记笔记的关联关系了. 记住以后 笔记记了就是用来复习的!!!不看不就啥用没了吗!!! content: 1.p ...

  6. Python 对象引用、可变性和垃圾回收

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 变量不是盒子 在示例所示的交互式控制台中,无法使用"变量是盒 ...

  7. Python进阶:set和dict/对象引用、可变性和垃圾回收/元类编程/迭代器和生成器

    frozenset:不可变集合,无序,不重复 dict上的特性: 1. dict的key或者set的值 都必须是可以hash的(不可变对象 都是可hash的, str, fronzenset, tup ...

  8. Python对象的引用、可变性和垃圾回收

    1.标识.相等性和别名 别名的例子 >>> charles = {'name': 'Charles L. Dodgson', 'born': 1832} >>> l ...

  9. 类装饰器,元类,垃圾回收GC,内建属性、内建方法,集合,functools模块,常见模块

    '''''''''类装饰器'''class Test(): def __init__(self,func): print('---初始化---') print('func name is %s'%fu ...

随机推荐

  1. 控制html元素的隐藏问题

    控制元素隐藏的方式,有display:none.visibility:hidden以及不透明度设置. 一.display:none 被隐藏的元素,在页面中不占位,空出的位置会被相邻的元素占用. < ...

  2. 迷你MVVM框架 avalonjs 学习教程10、样式操作

    一般情况下我们通过设置类名就可以改变元素的样式,但涉及到动画部分,就一定需要设置内联样式了,因此有了ms-css.*ms-css*的用法为ms-css-样式名="样式值", 如ms ...

  3. mysql备份和还原命令

    备份和还原数据库都是在未登录的前提下进行命令操作的: 1.备份表: mysqldump -u root -p dbname table1 table2 > D:\sqlback.sql 2.备份 ...

  4. JVM7、8详解及优化

    一.引言:永久代为什么被移出HotSpot JVM了? 详见:JEP 122: Remove the Permanent Generation 原因主要有两个: 1.由于Permanent Gener ...

  5. HSTS详解

    1. 缘起:启用HTTPS也不够安全 有不少网站只通过HTTPS对外提供服务,但用户在访问某个网站的时候,在浏览器里却往往直接输入网站域名(例如www.example.com),而不是输入完整的URL ...

  6. Java集合set的并、交、差操作

    集合的并.交.差操作 Set<Integer> result = new HashSet<Integer>(); Set<Integer> set1 = new H ...

  7. #define宏常量和const常量的区别

    C++ 语言可以用const 来定义常量,也可以用#define 来定义常量.但是前者比后者有更多的优点:(1) const 常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查.而 ...

  8. 【校招面试 之 C/C++】第1题 为什么优先使用构造函数的初始化列表

    1.首先看一个例子: #include<iostream> using namespace std; class Test1 { public: Test1() // 无参构造函数 { c ...

  9. HashMap的hash冲突解决方案

    Hash函数 非哈希表的特点:关键字在表中的位置和它之间不存在一个确定的关系,查找的过程为给定值一次和各个关键字进行比较,查找的效率取决于和给定值进行比较的次数. 哈希表的特点:关键字在表中位置和它之 ...

  10. JAVA规则引擎JSR-94笔札

    JAVA规则引擎JSR-94笔札 JSR-94 是由JCP(Java Community Process)组织所制定的java规则引擎API的java请求规范.它主要定义了规则引擎在java运行时的一 ...