修炼者
修炼者
发布于 2025-07-05 / 21 阅读
0
0

Python的生成器与迭代器、浅复制与深复制

生成器

语法比较独特,可以为一些前置共同条件的函数提供实现便利。如下:

def myGenerator(num):
  now = 0
  while now < num:
    val = yield now
    now = now + 1 if val is None else val


mg_ins_01 = myGenerator(5)

for i in mg_ins_01:
  print (i)

迭代器

有__iter__函数和__next__函数的对象都是可迭代对象。如下:

class MyIter(object):

  def __init__(self,data):
    self.data = data
    self.now = 0
  
  def __iter__(self):
    return self
  
  def __next__(self):
    while self.now < self.data:
      self.now += 1
      return self.now - 1
    
    raise StopIteration
  

iter_ins_01 =  MyIter(5)

for i in iter_ins_01:
  print(i)

对象赋值、浅拷贝、深拷贝

对象赋值一般只是赋值了一个指针(类比于C),实际内容在内存中还是一份。浅拷贝会将对象中的简单值赋值一个新副本,但是设计嵌套的对象,则也是简单赋值一个指针(类比于C)。深拷贝则是全部创建副本。

# encoding = utf-8
import copy

def dumpObj(prefix,obj):
  print(f"{prefix} address is {id(obj)}")
  print(obj)
  print(f"element address is {[id(ele) for ele in obj]}")

def asignObj(obj):
  print ("asign : ============================")
  obj1 = obj
  dumpObj("obj:",obj)
  dumpObj("obj1:",obj1)

  obj1[0] = "gauss-001"  
  obj1[3][0] = "gauss-001"
  dumpObj("obj1:",obj1)
  dumpObj("obj",obj)

def copyObj(obj):
  print ("copy : ============================")
  
  obj1 = copy.copy(obj)
  dumpObj("obj:",obj)
  dumpObj("obj1:",obj1)

  obj1[0] = "gauss-001"  
  obj1[3][0] = "gauss-001"
  dumpObj("obj1:",obj1)
  dumpObj("obj",obj)

def deepCopyObj(obj):
  print ("deppcopy : ============================")
  
  obj1 = copy.deepcopy(obj)
  dumpObj("obj:",obj)
  dumpObj("obj1:",obj1)

  obj1[0] = "gauss-001"  
  obj1[3][0] = "gauss-001"
  dumpObj("obj1:",obj1)
  dumpObj("obj",obj)


object1 = ["gauss","c++","master",["gauss","java","master"]]
asignObj(object1)

object1 = ["gauss","c++","master",["gauss","java","master"]]
copyObj(object1)

object1 = ["gauss","c++","master",["gauss","java","master"]]
deepCopyObj(object1)


评论