为什么在语法完全正确的行中出现“SyntaxError: invalid syntax”?

59 投票
4 回答
1200418 浏览
提问于 2025-04-18 09:54

这段代码是:

guess = Pmin+(Pmax-Pmin)*((1-w**2)*fi1+(w**2)*fi2)

PminPmaxwfi1fi2 这些变量在这个时候都已经被赋予了具体的值,那为什么还会出现错误呢?

当我把那行代码删掉后,下一行代码又出现了同样的错误,原因似乎也不明。

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

撰写回答