author: UpDown published: True created: 2022年5月10日17点06分 tags: Done version: Outer
==,is
- is 是比较两个引用是否指向了同一个对象(引用比较)。
- == 是比较两个对象的值是否相等(值比较)。
深拷贝,浅拷贝
Python中有2种不同的拷贝程度
- 深拷贝
- 浅拷贝
还有一种特殊情况:
- 直接赋值
浅拷贝对不可变类型和可变类型的copy不同
- 元组里是不可变类型是 深浅拷贝结果一样 都是引用传递
当元组中嵌套可变类型时 浅拷贝就是引用传递 深拷贝就会把元且重新生成一份
深拷贝
对于一个对象所有层次的拷贝(递归)
import copy
a = [1,2,3, [1,2,4,[1,2,3]]]
b = copy.deepcopy(a)
print(id(a[3][3]))
print(a[3][3])
print(id(b[3]))
print(b[3][3])
with(上下文管理器)
任何实现了 enter()和 exit()方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with关键字
with open('out.txt', 'w') as f:
f.write("hello , the simplest context manager")
自己实现with原理
class File():
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
print("entering")
self.f = open(self.filename, self.mode)
return self.f
def __exit__(self, *args):
print("will exit")
self.f.close()
contextmanager
Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。
通过yield 将函数分割成两部分,yield 之前的语句在enter方法中执行,yield之后的语句在 exit方法中执行。紧跟在 yield 后面的值是函数的返回值。 ```python from contextlib import contextmanager
@contextmanager def my_open(path, mode): f = open(path, mode) yield f f.close()
with my_open(‘out.txt’, ‘w’) as f: f.write(“hello , the simplest context manager”) ```