'Helper to set value at location given by key.
Examples
>>> from sympy import Matrix, I, zeros, ones
>>> m = Matrix(((1, 2+I), (3, 4)))
>>> m
Matrix([
[1, 2 + I],
[3,     4]])
>>> m[1, 0] = 9
>>> m
Matrix([
[1, 2 + I],
[9,     4]])
>>> m[1, 0] = [[0, 1]]
To replace row r you assign to position r*m where m
is the number of columns:
>>> M = zeros(4)
>>> m = M.cols
>>> M[3*m] = ones(1, m)*2; M
Matrix([
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[2, 2, 2, 2]])
And to replace column c you can assign to position c:
>>> M[2] = ones(m, 1)*4; M
Matrix([
[0, 0, 4, 0],
[0, 0, 4, 0],
[0, 0, 4, 0],
[2, 2, 4, 2]])'

def _setitem(self, key, value):

    from .dense import Matrix
    is_slice = isinstance(key, slice)
    (i, j) = key = self.key2ij(key)
    is_mat = isinstance(value, MatrixBase)
    if ((type(i) is slice) or (type(j) is slice)):
        if is_mat:
            self.copyin_matrix(key, value)
            return
        if ((not isinstance(value, Expr)) and is_sequence(value)):
            self.copyin_list(key, value)
            return
        raise ValueError(('unexpected    value:    %s' % value))
    else:
        if ((not is_mat) and (not isinstance(value, Basic)) and is_sequence(value)):
            value = Matrix(value)
            is_mat = True
        if is_mat:
            if is_slice:
                key = (slice(*divmod(i, self.cols)), slice(*divmod(j, self.cols)))
            else:
                key = (slice(i, (i + value.rows)), slice(j, (j + value.cols)))
            self.copyin_matrix(key, value)
        else:
            return (i, j, self._sympify(value))
        return
