<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def copy(self, tx_ins=None, tx_outs=None, lock_time=None,
             expiry_height=None, value_balance=None, tx_shielded_spends=None,
             tx_shielded_outputs=None, tx_joinsplits=None,
             joinsplit_pubkey=None, joinsplit_sig=None, binding_sig=None):
        '''
        SaplingTx, ... -> SaplingTx

        Makes a copy. Allows over-writing specific pieces.
        '''
        return SaplingTx(
            tx_ins=tx_ins if tx_ins is not None else self.tx_ins,
            tx_outs=tx_outs if tx_outs is not None else self.tx_outs,
            lock_time=(lock_time if lock_time is not None
                       else self.lock_time),
            expiry_height=(expiry_height if expiry_height is not None
                           else self.expiry_height),
            value_balance=(value_balance if value_balance is not None
                           else self.value_balance),
            tx_shielded_spends=(
                tx_shielded_spends if tx_shielded_spends is not None
                else self.tx_shielded_spends),
            tx_shielded_outputs=(
                tx_shielded_outputs if tx_shielded_outputs is not None
                else self.tx_shielded_outputs),
            tx_joinsplits=(tx_joinsplits if tx_joinsplits is not None
                           else self.tx_joinsplits),
            joinsplit_pubkey=(joinsplit_pubkey if joinsplit_pubkey is not None
                              else self.joinsplit_pubkey),
            joinsplit_sig=(joinsplit_sig if joinsplit_sig is not None
                           else self.joinsplit_sig),
            binding_sig=(binding_sig if binding_sig is not None
                         else self.binding_sig))