一元的python坏操作数类型 - :'NoneType'

时间:2016-09-23 10:54:04

标签: python nonetype

我发给你一个问题,因为我在python上有问题,我不明白为什么。 我创建了一个函数“mut1”来改变列表中的数字(概率为1/2),无论是加1还是减1,除了0​​和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功能很好,例如,如果我创建一个列表P1:

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

之后,我在列表p1

中的数字(此处为3)处应用“mut1”
>>>mut1(p1[1,1]) 

Hovewer如果我写:

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

我有一条消息错误:

  

回溯(最近一次调用最后一次):文件“&lt; stdin&gt;”,第1行,in   &LT;模块&GT; TypeError:long()参数必须是字符串或数字,而不是   'NoneType'

1 个答案:

答案 0 :(得分:1)

这是因为您必须让mut1返回numpy.int64类型的结果。所以我尝试使用你的以下修改代码并且工作了。

>>> 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])
>>>

因此,您唯一需要更改的是将print m替换为return np.int64(m)然后应该有效!

您将很容易理解为什么会出现以下类型的调试代码:

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