skbio.sequence.DNA.copy

DNA.copy(deep=False)[source]

Return a copy of this sequence.

Note

Deprecated as of 0.4.1 for removal in 0.5.1. Use copy.copy(seq) instead of seq.copy(deep=False), and copy.deepcopy(seq) instead of seq.copy(deep=True).

Parameters:

deep : bool, optional

Perform a deep copy. If False, perform a shallow copy.

Returns:

Sequence

Copy of this sequence.

Notes

Since sequence objects can share the same underlying immutable sequence data (or pieces of it), this method can be used to create a sequence object with its own copy of the sequence data so that the original sequence data can be garbage-collected.

Examples

Create a sequence:

>>> from pprint import pprint
>>> from skbio import Sequence
>>> seq = Sequence('ACGT',
...                metadata={'id': 'seq-id', 'authors': ['Alice']},
...                positional_metadata={'quality': [7, 10, 8, 5],
...                                     'list': [[], [], [], []]})

Make a shallow copy of the sequence:

>>> seq_copy = seq.copy()
>>> seq_copy == seq
True

Setting new references in the copied sequence’s metadata doesn’t affect the original sequence’s metadata:

>>> seq_copy.metadata['id'] = 'new-id'
>>> pprint(seq_copy.metadata)
{'authors': ['Alice'], 'id': 'new-id'}
>>> pprint(seq.metadata)
{'authors': ['Alice'], 'id': 'seq-id'}

The same applies to the sequence’s positional metadata:

>>> seq_copy.positional_metadata.loc[0, 'quality'] = 999
>>> seq_copy.positional_metadata
  list  quality
0   []      999
1   []       10
2   []        8
3   []        5
>>> seq.positional_metadata
  list  quality
0   []        7
1   []       10
2   []        8
3   []        5

Since only a shallow copy was made, updates to mutable objects stored as metadata affect the original sequence’s metadata:

>>> seq_copy.metadata['authors'].append('Bob')
>>> pprint(seq_copy.metadata)
{'authors': ['Alice', 'Bob'], 'id': 'new-id'}
>>> pprint(seq.metadata)
{'authors': ['Alice', 'Bob'], 'id': 'seq-id'}

The same applies to the sequence’s positional metadata:

>>> seq_copy.positional_metadata.loc[0, 'list'].append(1)
>>> seq_copy.positional_metadata
  list  quality
0  [1]      999
1   []       10
2   []        8
3   []        5
>>> seq.positional_metadata
  list  quality
0  [1]        7
1   []       10
2   []        8
3   []        5

Perform a deep copy to avoid this behavior:

>>> seq_deep_copy = seq.copy(deep=True)

Updates to mutable objects no longer affect the original sequence’s metadata:

>>> seq_deep_copy.metadata['authors'].append('Carol')
>>> pprint(seq_deep_copy.metadata)
{'authors': ['Alice', 'Bob', 'Carol'], 'id': 'seq-id'}
>>> pprint(seq.metadata)
{'authors': ['Alice', 'Bob'], 'id': 'seq-id'}

Nor its positional metadata:

>>> seq_deep_copy.positional_metadata.loc[0, 'list'].append(2)
>>> seq_deep_copy.positional_metadata
     list  quality
0  [1, 2]        7
1      []       10
2      []        8
3      []        5
>>> seq.positional_metadata
  list  quality
0  [1]        7
1   []       10
2   []        8
3   []        5