author: UpDown published: True created: 2022年5月10日17点06分 tags: Done version: Outer

==,is

  • is 是比较两个引用是否指向了同一个对象(引用比较)。
  • == 是比较两个对象的值是否相等(值比较)。

image.png

深拷贝,浅拷贝

https://blog.updown.world/articles/python/pythonbook2/02-Python%E9%AB%98%E7%BA%A72/04-%E6%B7%B1%E6%8B%B7%E8%B4%9D%E3%80%81%E6%B5%85%E6%8B%B7%E8%B4%9D.html

Python中有2种不同的拷贝程度

  • 深拷贝
  • 浅拷贝

还有一种特殊情况:

  • 直接赋值

浅拷贝对不可变类型和可变类型的copy不同

  1. copy.copy对于可变类型,会进行浅拷贝
  2. copy.copy对于不可变类型,不会拷贝,仅仅是指向。元组特殊另说

    特殊情况:元组

  • 元组里是不可变类型是 深浅拷贝结果一样 都是引用传递
  • 当元组中嵌套可变类型时 浅拷贝就是引用传递 深拷贝就会把元且重新生成一份

    深拷贝

    对于一个对象所有层次的拷贝(递归)

    1. import copy
    2. a = [1,2,3, [1,2,4,[1,2,3]]]
    3. b = copy.deepcopy(a)
    4. print(id(a[3][3]))
    5. print(a[3][3])
    6. print(id(b[3]))
    7. print(b[3][3])

    简单来说,如果浅拷贝能用则用,否则再用深拷贝,这样节省内存

    with(上下文管理器)

    任何实现了 enter()和 exit()方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with关键字

    1. with open('out.txt', 'w') as f:
    2. f.write("hello , the simplest context manager")

    自己实现with原理

    1. class File():
    2. def __init__(self, filename, mode):
    3. self.filename = filename
    4. self.mode = mode
    5. def __enter__(self):
    6. print("entering")
    7. self.f = open(self.filename, self.mode)
    8. return self.f
    9. def __exit__(self, *args):
    10. print("will exit")
    11. 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”) ```