为什么在语法完全正确的行中出现“SyntaxError: invalid syntax”?
这段代码是:
guess = Pmin+(Pmax-Pmin)*((1-w**2)*fi1+(w**2)*fi2)
Pmin
、Pmax
、w
、fi1
和 fi2
这些变量在这个时候都已经被赋予了具体的值,那为什么还会出现错误呢?
当我把那行代码删掉后,下一行代码又出现了同样的错误,原因似乎也不明。
def Psat(self, T):
pop= self.getPborder(T)
boolean=int(pop[0])
P1=pop[1]
P2=pop[2]
if boolean:
Pmin = float(min([P1, P2]))
Pmax = float(max([P1, P2]))
Tr=T/self.typeMolecule.Tc
w=0.5*(1+scipy.tanh((10**5)*(Tr-0.6)))
fi1=0.5*(1-scipy.tanh(8*((Tr**0.4)-1)))
fi2=0.460*scipy.sqrt(1-(Tr-0.566)**2/(0.434**2)+0.494
guess = Pmin+(Pmax-Pmin)*((1-w**2)*fi1+(w**2)*fi2) # error here
solution = scipy.optimize.newton(funcPsat,guess, args=(T,self))
4 个回答
-3
我发现,有时候在代码里出现“语法错误”,但看起来并没有什么明显的问题,这可能是因为在某些地方用了空格。
print(f'{something something}')
在Python的IDLE环境中,第一行的某个部分会被跳过并高亮显示,原因不明(即使第一行其实是注释),这让人感到困惑。
3
我遇到了一个类似的问题,出现了一个语法错误,但我知道这个地方不应该有语法错误。后来发现,是因为我的Python 2解释器在尝试运行Python 3的代码,或者反过来;我觉得是我的环境变量PYTHONPATH里同时包含了Python 2和Python 3的内容。
9
你在这一行缺少一个右括号:
fi2=0.460*scipy.sqrt(1-(Tr-0.566)**2/(0.434**2)+0.494
这里有三个左括号 (
,但只有两个右括号 )
。
107
在早期版本的Python中(1),你可能会在看起来没问题的代码行上看到错误提示。这种情况下,你可以尝试把出错的那一行注释掉。如果错误提示移到了下一行,那就有两种可能性:
- 要么这两行都有问题(第二行的问题被第一行隐藏了);要么
- 前一行有问题,这个问题被带到了当前行。
后一种情况更常见,特别是当你注释掉新出错的那一行后,错误又移动了。
举个例子,假设有如下代码,保存为prog.py
:
xyzzy = (1 +
plugh = 7
在Python 3.8.10中,错误会在第2行被报告,尽管问题实际上是由第1行引起的:
pax> python3.8 prog.py
File "prog.py", line 2
plugh = 7
^
SyntaxError: invalid syntax
你提问中的代码也有类似的问题:报告错误的前一行代码有不匹配的括号。
为了更清楚,标注如下:
# open parentheses: 1 2 3
# v v v
fi2=0.460*scipy.sqrt(1-(Tr-0.566)**2/(0.434**2)+0.494
# ^ ^
# close parentheses: 1 2
其实没有一个通用的解决办法——代码需要被分析和理解,才能确定如何修改括号。
(1) 顺便提一下,Python 3.9引入的新PEG解析器为更好的错误信息铺平了道路(从3.10到3.12逐渐改进)。这包括能够正确识别源代码中错误的位置:
pax> python3 prog.py
File "prog.py", line 1
xyzzy = (1 +
^
SyntaxError: '(' was never closed