- is 用来判断两个变量关联的对象是否是同一个,是否指向同一个内存地址,相当于 id(a) == id(b);
(id() 获取对象的标识、内存地址) - == 判断两个变量对应的值是否相等,默认会调用对象的__eq__方法。
[备注]
1、小整数对象[-5,256],在全局解释器范围内被重复使用,不会被GC回收。所以无论脚本模式下还是交互式模式下,值相等的小整数都对应同一个地址。
2、同一个代码块中的不可变对象,只要值是相等的就不会重复创建新的对象。
所以,通过 is 对比小整数范围[-5, 256]内的值相同的不同变量时,命令行模式和脚本模式输出一致,都是True。超出小整数范围的整数及其他不可变对象,输出则不同,命令行模式输入False,脚本模式输入True。
什么是代码块:一个模块文件、一个函数体、一个类、交互式命令中的单行代码。
所以在交互式模式下 x = 257 和y = 257 是两个独立代码块,Python会创建新的内存空间;但是在脚本模式下 x = 257 与 y = 257 属于同一个代码块,python不会创建新的内存空间。
>>> a = 256 >>> b = 256 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False >>> a = 257; b = 257 # 效果与脚本模式相同 >>> a is b True >>> a = -5 >>> b = -5 >>> a is b True >>> a=-6 >>> b=-6 >>> a is b False >>> a = -6; b = -6 # 效果与脚本模式相同 >>> a is b True >>> a=(1,2); b=(1,2) # 效果与脚本模式相同 >>> a is b True >>> id(a) 2064077050176 >>> id(b) 2064077050176
[ reference ]
https://blog.csdn.net/wangpachong/article/details/123349046
三种创建新变量的不同方式。
- 直接赋值:将对象a直接赋值给变量b,生成b与a对应相同的对象实体,仅是对象引用的复制
- 浅拷贝:copy.copy(a)方法复制对象a赋值给变量b,生成b与a对应不同的对象实体,但对象内部的子对象共用相同的对象实体
- 深拷贝:copy.deepcopy(a)方法复制对象a赋值给变量b,a、b两者对应完全不同的对象及其子对象实体
直接赋值:生成变量是对象实体的引用(别名,标签)
浅拷贝:拷贝了父对象,不会拷贝对象内部的子对象(list, dict)。仅拷贝数据集合的第一层数据。
深拷贝:完全拷贝了父对象及其子(可变)对象,使用copy模块的deepcopy方法。拷贝数据集合的所有层。
深拷贝会把可变对象也拷贝一份,而浅拷贝不会。
面例子中说的是列表(可变对象)的拷贝,那对于元组,字符等不可不对象呢?
答案是,对不可变对象,不存在深浅拷贝的问题。无论怎么拷贝,效果都是新建立一个指向不可变对象的指针而已。
import copy
a = {1: [1, 2, [33, 44]], 2: (2, 3, 4)} # tuple (2,3,4) 为不可变对象,无论那种方式,均引用共同的对象
b = a
c = a.copy()
d = copy.deepcopy(a)
代码各对象的关系示意图。
(绘图工具地址:https://pythontutor.com/)
-
可变对象:list, dict, set
-
不可变对象:tuple, str, bytes, int, float
-
Container sequences:
list, tuple, and collections.deque can hold items of different types. -
Flat sequences:
str, bytes, bytearray, memoryview, and array.array hold items of one type.
引用计数的方式为主,会对变量的引用进行计数,引用数为零时,释放变量。
标记清除、分代回收
二、编码技巧 5、列举布尔值为False的常见值
0, [], {}, (), None, '', False
6、按字典的key或value对其排序
d = {'a': 13, 'f': 11, 'c': 7, 'b': 24}
e = sorted(d.items(), key=lambda x: x[1])
f = sorted(d.items(), key=lambda x: x[0])
print(e) # [('c', 7), ('f', 11), ('a', 13), ('b', 24)]
print(f) # [('a', 13), ('b', 24), ('c', 7), ('f', 11)]
7、反转字符串的简单方法
s = 'Hello, World!' reversed_s = s[::-1] # 生成新的字符串变量:'!dlroW ,olleH'8、按age逆序排列如下对象
list1 = [{'name': 'a', 'age':23}, {'name': 'b', 'age':15}, {'name': 'c', 'age':99}]
list2 = sorted(list1, key=lambda x: x['age'], reverse=True)
print(list2) #[{'name': 'c', 'age': 99}, {'name': 'a', 'age': 23}, {'name': 'b', 'age': 15}]
9、常用字符串格式方法
s = 'I am {}, I am {} old'.format('HanMeimei', 15)
sa = 'I am %s, I am %s old' % ('HanMeimei', 15)
10、python实现单例模式
11、__new__和__init__区别?
12、三目运算符
13、协程相关知识


