2017-06-22 88 views
2

前引用了我在使用PyCharm社区编辑一个简单的练习,我得到一个警告:没有局部变量,但警告:分配

这种检查发出警告之前 分配引用局部变量。

但是这里没有局部变量,并且它在Windows PowerShell上运行良好。它出什么问题了?

# This is a guess the number game. 
import random 
secret_number = random.randint(1, 21) 
print("I am thinking of a number between 1 and 20. You have three chances.") 

# Ask the player to guess 3 times. 
for guesses_taken in range(1, 4): 
    guess = int(input('Take a guess.\n')) 
    if guess > secret_number: 
     print('Your guess is too high.') 
    elif guess < secret_number: 
     print('Your guess is to low.') 
    elif guess == secret_number: 
     if guesses_taken == 1: 
      print('Oh my god. You just guessed only one time.') 
     else: 
      print("You are right. I'm thinking of %s, and you guessed my 
       number in %s guesses." % (secret_number, guesses_taken)) 
    else: 
     break 
if guess != secret_number: --> # Name 'guess' can be not defined. 
    print('Nope. The number I was thinking of was ' + str(secret_number) + '.') 

同样,这里修改后的版本仍然有同样的问题。

# This is a guess the number game. 
import random 
secret_number = random.randint(1, 21) 
print("I am thinking of a number between 1 and 20. You have three chances.") 

# Ask the player to guess 3 times. 
for guesses_taken in range(1, 4): 
    guess = int(input('Take a guess.\n')) 
    if guess > secret_number: 
     print('Your guess is too high.') 
    elif guess < secret_number: 
     print('Your guess is to low.') 
    else: 
     break 
if guess == secret_number: --> # Name 'guess' can be not defined 
    if guesses_taken == 1: --> # Name 'guesses_taken' can be not defined 
     print('Oh my god. You just guessed only one time.') 
    else: 
     print("You are right. I'm thinking of %s, and you guessed my number in %s guesses." % (
      secret_number, guesses_taken)) 
else: 
    print('Nope. The number I was thinking of was ' + str(secret_number) + '.') 

回答

1

你得到警告:他们不意味着按照预期的代码将无法正常工作,但他们想告诉你的事情可能出错在一定circomstances。

我不使用PyCharm,但我看到这些警告的原因是:

  • guess得到您的for循环内分配。所以,如果循环不执行至少一次,guess永远不会被分配。

  • guesses_taken将首先被分配range的第一个值,然后第二个......但如果range均是空的,它也将永远不会得到分配。

见,例如:

for loop_index in range(1, -1): # empty! 
    my_value_assigned_in_loop = 1 

print(loop_index) 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-31-39f9878362fc> in <module>() 
     2  my_value_assigned_in_loop = 1 
     3 
----> 4 print(loop_index) 

NameError: name 'loop_index' is not defined 
+0

**感谢您的帮助**但是,在编程过程中这个问题允许,还是会带来更多意想不到的麻烦? – Tuto

+1

不,你的程序非常好,因为你的循环肯定会执行。 PyCharm用来给你警告的规则可能不会考虑到这些,只依赖于代码的一般结构。无论如何,在没有真正执行它的情况下,可以做什么都有限制。所以,没有任何麻烦! –

+0

**非常感谢** – Tuto