Search code examples
pythonnonetype

python bad operand type for unary -: 'NoneType'


I send you a question because I have a problem on python and I don't understand why. I created a function "mut1" to change the number inside a list (with a probability to 1/2) either in adding 1 or subtracting 1, except for 0 and 9:

def mut1 (m):
    i=np.random.randint(1,3)
    j=np.random.randint(1,3)
    if i==1:
        if 0<m<9:
            if j==1:
                m=m+1
            elif j==2:
                m=m-1
        elif m==0:
            if j==1:
                m=1
            if j==2:
                m=9
        elif m==9:
            if j==1:
                m=0
            if j==2:
                m=8
    print m

mut1 function well, for example, if I create a list P1:

>>>p1=np.array(range(8),int).reshape((4, 2))

After that, I apply "mut1" at a number (here 3) in the list p1

>>>mut1(p1[1,1]) 

Hovewer if I write:

>>> p1[1,1]=mut1(p1[1,1])

I have a message error:

Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: long() argument must be a string or a number, not 'NoneType'


Solution

  • That happens because you have to make your mut1 return an numpy.int64 type of result. So I tried with the following modified code of yours and worked.

    >>> import numpy as np
    >>> import random
    >>>
    >>> def mut1 (m):
    ...     i=np.random.randint(1,3)
    ...     j=np.random.randint(1,3)
    ...     if i==1:
    ...         if 0<m<9:
    ...             if j==1:
    ...                 m=m+1
    ...             elif j==2:
    ...                 m=m-1
    ...         elif m==0:
    ...             if j==1:
    ...                 m=1
    ...             if j==2:
    ...                 m=9
    ...         elif m==9:
    ...             if j==1:
    ...                 m=0
    ...             if j==2:
    ...                 m=8
    ...     return np.int64(m)
    ...
    >>> p1=np.array(range(8),int).reshape((4, 2))
    >>> mut1(p1[1,1])
    2
    >>> p1[1,1]=mut1(p1[1,1])
    >>>
    

    So the only thing you need to change is to replace print m with return np.int64(m) and then should work!

    You will easily understand why this happened with the following kind of debugging code:

    >>> type(p1[1,1])
    <type 'numpy.int64'>
    >>> type(mut1(p1[1,1]))
    <type 'NoneType'>