def full_alpha_values_from_surface(surf):
    """Return list of lists representing alpha values.

    Parameters
    ==========
    surf (pygame.Surface instance)
        surface used as source of alpha values.

    How it works
    ============

    The alpha values are stored as a list containing
    other lists. That is, the top list holds lists
    which represent columns of the source surface
    and hold the alpha value of each pixel in that
    column.

    To be more specific, the columns are listed from
    the leftmost to the rightmost pixel column of the
    source surface and the values within each column
    correspond to the values from the pixel at the top
    of column to the one at its bottom.

    This list of lists is meant to be used in the
    AlphaMask.mask_by_replacing() masking operation
    whenever needed.
    """
    ### copy the alpha values of the surface in a lists
    ### of lists with the same structure as the numpy array
    ### obtained with pixels_alpha(surf)
    ###
    ### why do we copy the values of the array instead
    ### of using the array iteself? we don't do so because
    ### though the array is indeed faster than normal Python
    ### lists for certain operations, it is slower for other
    ### kind of operations;
    ###
    ### since we only want to keep the alpha values to
    ### iterate over them, using normal Python lists is
    ### way faster, which is why we keep the values of
    ### the array as a list of lists;
    ###
    ### additionally, we convert the numpy integers (uint
    ### class) to regular Python integers; we do so because
    ### the AlphaMask.subtract() operation causes an
    ### RuntimeWarning to be issued with the message
    ### "overflow encountered in ubyte_scalars"; though
    ### not versed in the inner workings of uint objects,
    ### the practical effect of this is that such operation
    ### doesn't produce the desired behaviour; converting
    ### the uint instaces to int instances in this method
    ### fixes the problem;
    ###
    ### however, this affects some of the masking operations,
    ### making some operations faster (mask_by_multiplying())
    ### and other operations slower (mask_by_replacing());
    ###
    ### the differences in speed for such operations as well
    ### as for other operations which we didn't measure
    ### aren't considered relevant, though, since no matter
    ### the differences that may exist, they not only may
    ### benefit us (as with the mask_by_multiplying()
    ### method), but even when they would not (as with the
    ### mask_by_replacing() method), the differences
    ### observed in practice cannot be perceived by a human;

    return [
        list(map(int, alpha_values_in_column))
        for alpha_values_in_column in pixels_alpha(surf)
    ]
Return list of lists representing alpha values.

    Parameters
    ==========
    surf (pygame.Surface instance)
        surface used as source of alpha values.

    How it works
    ============

    The alpha values are stored as a list containing
    other lists. That is, the top list holds lists
    which represent columns of the source surface
    and hold the alpha value of each pixel in that
    column.

    To be more specific, the columns are listed from
    the leftmost to the rightmost pixel column of the
    source surface and the values within each column
    correspond to the values from the pixel at the top
    of column to the one at its bottom.

    This list of lists is meant to be used in the
    AlphaMask.mask_by_replacing() masking operation
    whenever needed.
    
nodezator/alphamask/utils.py