你一定遇到过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允许的上下文中使用 。
有三种常见的方式 , 你可以错误地使用关键字:
- 拼错的关键字
- 缺少一个关键字
- 滥用关键字
>>> 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 。
- 麒麟|荣耀新款,麒麟810+4800万超清像素,你还在犹豫什么呢?
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- 国产手机|国产手机新品频发,果粉们你们还能忍得住吗?
- 抖音小店|抖音进军电商,短视频的商业模式与变现,创业者该如何抓住机遇?
- 减重|快看!奇瑞蚂蚁都减重了 那你还焦虑什么?
- 化妆产品|直播带货年入百万,这8个行业告诉你:是真的
- 关华为P50Pro|华为P50Pro概念图:半圆形6摄,看完iPhone12劝你暂时别买
- 屏幕|苹果iPhone12屏幕不仅发白,还绿的你发慌,用户:环保绿
- 主题活动|首届“上海在线生活节”启动,8大电商平台优惠活动承包你的12月
- 月入|一上网,感觉网上每个人都是月入过万,到底是错觉还是你out了?