>> 'foo' = 1File "", line 1SyntaxError: can't assign to literal>>> 1 = 'foo'File "", line 1SyntaxError: can't assign to li。你一定遇到过Python中的无效语法,常见原因和解决办法( 二 )。" />

你一定遇到过Python中的无效语法,常见原因和解决办法( 二 )


>>> len('hello') = 5File "", line 1SyntaxError: can't assign to function call>>> 'foo' = 1File "", line 1SyntaxError: can't assign to literal>>> 1 = 'foo'File "", line 1SyntaxError: can't assign to literal第一个示例尝试将值5分配给len()调用 。 在这种情况下 , SyntaxError消息非常有用 。 它告诉你不能给函数调用赋值 。
第二个和第三个示例尝试将字符串和整数分配给文字 。 同样的规则也适用于其他文字值 。 同样 , 回溯消息表明 , 当您试图将一个值赋给一个文字时 , 问题就会发生 。
【你一定遇到过Python中的无效语法,常见原因和解决办法】注意:上面的示例缺少重复的代码行和指向回溯中的问题的插入符号(^) 。 当您在REPL中尝试从文件中执行这段代码时 , 您看到的异常和回溯将是不同的 。 如果这个代码在一个文件中 , 那么您将得到重复的代码行和指向问题的插入符号 , 正如您在本教程的其他情况中看到的那样 。
很可能你的目的不是给文字或函数调用赋值 。 例如 , 如果您不小心省略了额外的等号(=) , 就会发生这种情况 , 这会将赋值转换为比较 。 如下所示 , 比较是有效的:
>>> len('hello') == 5True大多数情况下 , 当Python告诉您正在对无法赋值的东西进行赋值时 , 您首先可能需要检查以确保语句不应该是布尔表达式 。 当您试图为Python关键字赋值时 , 也可能遇到这个问题 , 下一节将讨论这个问题 。
2.拼写错误、缺少或误用Python关键字
Python关键字是一组在Python中具有特殊含义的受保护的单词 。 这些词在代码中不能用作标识符、变量或函数名 。 它们是语言的一部分 , 只能在Python允许的上下文中使用 。
有三种常见的方式 , 你可以错误地使用关键字:

  1. 拼错的关键字
  2. 缺少一个关键字
  3. 滥用关键字
如果您在Python代码中拼错了关键字 , 那么您将得到一个SyntaxError 。 例如 , 如果你把关键字拼错了 , 会发生以下情况:
>>> fro i in range(10):File "", line 1fro i in range(10):^SyntaxError: invalid syntax消息将读取SyntaxError:无效语法 , 但这没有多大帮助 。 回溯指向Python可以检测到错误的第一个地方 。 要修复这类错误 , 请确保所有Python关键字拼写正确 。
另一个关于关键字的常见问题是你完全忽略了它们:
>>> for i range(10):File "", line 1for i range(10):^SyntaxError: invalid syntax同样 , 异常消息也不是很有用 , 但是回溯确实试图为您指出正确的方向 。 如果从插入符号返回 , 则可以看到for循环语法中缺少关键字in 。
您还可能误用受保护的Python关键字 。 记住 , 关键字只允许在特定的情况下使用 。 如果您不正确地使用它们 , 那么您的Python代码中就会出现无效的语法 。 一个常见的例子是在循环外使用continue或break 。 这在开发过程中很容易发生 , 当你在实现一些东西的时候 , 碰巧把逻辑移出了一个循环:
>>> names = ['pam', 'jim', 'michael']>>> if 'jim' in names:...print('jim found')...break...File "", line 3SyntaxError: 'break' outside loop>>> if 'jim' in names:...print('jim found')...continue...File "", line 3SyntaxError: 'continue' not properly in loop在这里 , Python很好地告诉了您到底哪里出了问题 。 "'break' outside loop"和" continue' not exactly in loop"这两个信息可以帮助你明确地知道该怎么做 。 如果这段代码在一个文件中 , 那么Python也会让插入符号指向被误用的关键字 。
另一个例子是 , 如果你尝试给一个变量分配一个Python关键字 , 或者使用一个关键字来定义一个函数:
>>> pass = True File "", line 1pass = True^SyntaxError: invalid syntax>>> def pass():File "", line 1def pass():^SyntaxError: invalid syntax当您试图为pass分配一个值时 , 或者当您试图定义一个名为pass的新函数时 , 您将得到一个SyntaxError并再次看到“无效语法”消息 。
在Python代码中解决这种类型的无效语法可能会稍微困难一些 , 因为代码从外部看起来没什么问题 。 如果您的代码看起来不错 , 但是您仍然会得到一个SyntaxError , 那么您可以考虑检查您想要使用的变量名或函数名与您正在使用的Python版本的关键字列表 。
受保护的关键字列表随着Python的每个新版本而改变 。 例如 , 在Python 3.6中 , 您可以使用await作为变量名或函数名 , 但是在Python 3.7中 , 这个单词已经被添加到关键字列表中 。 现在 , 如果您尝试使用await作为变量名或函数名 , 如果您的代码是Python 3.7或更高版本 , 那么这将导致SyntaxError 。