2016-09-23 50 views
0

我發給你一個問題,因爲我有一個問題在python上,我不明白爲什麼。 我創建了一個函數「MUT1」更改列表內的號碼(與概率1/2)無論是在加1或減1,但不爲0和9:蟒蛇壞的操作數類型爲一元 - :'NoneType'

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

在那之後,我申請 「MUT1」 在列表中的號碼(這裏3)P1

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

Hovewer如果我寫:

>>> 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'

+7

你的函數返回'None'因爲沒有'在它return'聲明。印刷*不是同一件事*;那就是將價值寫入您的控制檯。 –

回答

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 mreturn np.int64(m)然後應該工作!

你會很容易理解爲什麼發生這種情況有以下類型的調試代碼:

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