diff --git a/crates/circuit/src/converters.rs b/crates/circuit/src/converters.rs index 0b853c7ffb08..9619c5ae243d 100644 --- a/crates/circuit/src/converters.rs +++ b/crates/circuit/src/converters.rs @@ -40,7 +40,13 @@ impl<'a, 'py> FromPyObject<'a, 'py> for QuantumCircuitData<'py> { Ok(QuantumCircuitData { data: data_borrowed.borrow().inner.clone(), name: ob.getattr(intern!(py, "name"))?.extract()?, - metadata: ob.getattr(intern!(py, "metadata")).ok(), + metadata: ob.getattr(intern!(py, "metadata")).ok().and_then(|m| { + if m.is_none() { + None + } else { + m.call_method0(intern!(py, "copy")).ok() + } + }), transpile_layout: ob.getattr(intern!(py, "layout")).ok(), }) } diff --git a/qiskit/converters/dag_to_circuit.py b/qiskit/converters/dag_to_circuit.py index 692965fff25c..1fccdedb41a8 100644 --- a/qiskit/converters/dag_to_circuit.py +++ b/qiskit/converters/dag_to_circuit.py @@ -68,7 +68,7 @@ def dag_to_circuit(dag, copy_operations=True): name=name, global_phase=dag.global_phase, ) - circuit.metadata = dag.metadata or {} + circuit.metadata = dag.metadata.copy() if dag.metadata else {} circuit._data = circuit_data circuit._duration = dag._duration circuit._unit = dag._unit diff --git a/test/python/converters/test_circuit_to_dag.py b/test/python/converters/test_circuit_to_dag.py index 909822f1a3a9..d02c3b8af2c5 100644 --- a/test/python/converters/test_circuit_to_dag.py +++ b/test/python/converters/test_circuit_to_dag.py @@ -207,6 +207,19 @@ def test_wire_order_failures(self): with self.assertRaisesRegex(ValueError, "does not contain exactly the same"): circuit_to_dag(qc, clbit_order=cr[[0, 1, 1]]) + def test_circuit_to_dag_metadata_is_copied(self): + """circuit_to_dag should return a DAG with a copy of the metadata, not a reference.""" + qc = QuantumCircuit(1, metadata={"key": "original"}) + dag = circuit_to_dag(qc) + self.assertIsNot(dag.metadata, qc.metadata) + self.assertEqual(dag.metadata, qc.metadata) + + def test_dag_to_circuit_metadata_is_copied(self): + """dag_to_circuit should return a circuit with a copy of the metadata, not a reference.""" + qc = QuantumCircuit(1, metadata={"key": "original"}) + result = dag_to_circuit(circuit_to_dag(qc)) + self.assertIsNot(result.metadata, qc.metadata) + if __name__ == "__main__": unittest.main(verbosity=2)