0

次のメソッド呼び出しがあります。

NCOLS = 3        
NPEGS = 4 

first_guess = []

print("calling first guess method")
first_guess = firstGuess(NCOLS, NPEGS, first_guess)
print("after method call: " + str(first_guess))

firstGuess メソッド:

def firstGuess(NCOLS, NPEGS, first_guess):
"""Used for setting up the first guess of the game"""
  print("in firstGuess method")
  for c in range(1, NCOLS + 1):
     if len(first_guess) == NPEGS:
         print("about to return first guess: " + str(first_guess))
         return first_guess
     else:
         first_guess.append(c)

  print("out of for loop, first_guess len is " + str(len(first_guess)) + ", " + str(first_guess))
  if len(first_guess) <= NPEGS: #there were less color options than pegs
     firstGuess(NCOLS, NPEGS, first_guess)

Noneこれは、私が理解できない理由で戻ってくるようです。

ここに私の出力があります:

calling first guess method
in firstGuess method
out of for loop, first_guess len is 3, [1, 2, 3]
in firstGuess method
about to return first guess: [1, 2, 3, 1]
after method call: None
Traceback (most recent call last):
File "mastermind.py", line 323, in <module>
sys.exit(main())
File "mastermind.py", line 318, in main
playOnce()
File "mastermind.py", line 160, in playOnce
first_guess = first_guess + str(g[0][i])
TypeError: 'NoneType' object is not subscriptable

なぜNone代わりに戻ってくるの[1, 2, 3, 1]ですか?

4

3 に答える 3

0

これは、明示的に何かを返すことで終わらないコード内のパスがあるためです。

firstGuess再帰的に呼び出している場所では、 return firstGuess(...)? ただし、失敗して何も返さない場合もあります。return first_guess最終ステートメントの後に最終ステートメントを追加する必要がありifます。

これを試して:

def firstGuess(NCOLS, NPEGS, first_guess):
  """Used for setting up the first guess of the game"""
  print("in firstGuess method")
  for c in range(1, NCOLS + 1):
     if len(first_guess) == NPEGS:
         print("about to return first guess: " + str(first_guess))
         return first_guess
     else:
         first_guess.append(c)

  print("out of for loop, first_guess len is " + str(len(first_guess)) + ", " + str(first_guess))
  if len(first_guess) <= NPEGS: #there were less color options than pegs
     return firstGuess(NCOLS, NPEGS, first_guess)
  return first_guess
于 2013-04-17T22:12:31.330 に答える
0

最後の 2 行を次のように変更します。

if len(first_guess) <= NPEGS: #there were less color options than pegs
    return firstGuess(NCOLS, NPEGS, first_guess)
else:
    # what do you do here?  return something
    return first_guess

すべてのブランチで戻ってくるわけではありません

于 2013-04-17T22:12:56.113 に答える