code: def perform(self, node, args, outs):
      if hasattr(args[0], "copy"):
          # when args[0] is a an ndarray of 0 dimensions,
          # this return a numpy.dtype and not an ndarray
          # So when the args have a copy attribute we use it
          # as this don't have this problem
          outs[0][0] = args[0].copy()
      else:
          outs[0][0] = copy.deepcopy(args[0])
  
imports: import copy
  import pickle
  import warnings
  from pytensor.graph.basic import Apply
  from pytensor.graph.op import Op
  from pytensor.link.c.op import COp
  from pytensor.link.c.type import CType
label_desc: Use image node_id 3 for calling the DeepCopyOp obj's underlying member method code with example usage: obj.perform(node, args, outs) without return types