检查某些字符的空字符串时,“ not in”身份运算符不起作用

wal*_*h21 6 python python-3.x

检查空字符串变量是否填充了某些字符时,表达式始终被评估为true。如果新创建的字符串值为空,则应为false,它不包含任何字符,更不用说要检查的字符了。

当我硬编码不是正在检查表达式的字符的随机字符时,将被评估为false。

difficulty = ''

while difficulty not in 'EMH':
    print('Enter difficulty: E - Easy, M - Medium, H - Hard')
    difficulty = input().upper()
Run Code Online (Sandbox Code Playgroud)

我希望看到调试器进入while循环。实际发生的情况是它继续经过while块而没有执行。

Dev*_*ngh 6

任何字符串中都存在一个空字符串。因此,你的条件,difficulty not in 'EMH'将评估到Falsedifficulty等于''; 因此while循环的主体将不会执行。

In [24]: '' not in 'EMH'                                                                                                                                  
Out[24]: False

In [33]: '' in 'EMH'                                                                                                                                      
Out[33]: True
Run Code Online (Sandbox Code Playgroud)

更好的方法可能是通过将该字符串转换EMH为列表,list('EMH')以使诸如EMEH,或空字符不会破坏循环,或者避免其从头开始

另外,正如@Blckknght所建议的那样,更好的替代方法是使用None难易度的默认值。

In [3]: difficulty = None                                                                                                                                

In [4]: while difficulty not in list('EMH'): 
   ...:     print('Enter difficulty: E - Easy, M - Medium, H - Hard') 
   ...:     difficulty = input().upper() 
   ...:                                                                                                                                                   
Enter difficulty: E - Easy, M - Medium, H - Hard
A
Enter difficulty: E - Easy, M - Medium, H - Hard
B
Enter difficulty: E - Easy, M - Medium, H - Hard
C
Enter difficulty: E - Easy, M - Medium, H - Hard
EM
Enter difficulty: E - Easy, M - Medium, H - Hard
E

In [5]:      
Run Code Online (Sandbox Code Playgroud)

  • 一旦使用列表而不是字符串,一个更好的默认值将是“无”。 (2认同)

Emm*_*t B 6

我认为您需要使用的是列表,而不是字符串:

difficulty = ''

while difficulty not in ['E','M','H']:
    print('Enter difficulty: E - Easy, M - Medium, H - Hard')
    difficulty = input().upper()
Run Code Online (Sandbox Code Playgroud)