python一元的错误操作数类型:“NoneType”

2024-04-25 05:59:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我给你发了一个问题,因为我对python有问题,我不明白为什么。 我创建了一个“mut1”函数来更改列表中的数字(概率为1/2),除了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]) 

如果我写:

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

我有一个消息错误:

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


Tags: 函数列表ifdefnp数字random概率
1条回答
网友
1楼 · 发布于 2024-04-25 05:59:43

这是因为您必须使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])
>>>

所以你唯一需要改变的就是用return np.int64(m)替换print m,然后就可以工作了!

通过以下调试代码,您将很容易理解为什么会发生这种情况:

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

相关问题 更多 >