【问题标题】:1, == (1,) - SyntaxError: invalid syntax1, == (1,) - SyntaxError: 无效语法
【发布时间】:2019-01-31 13:37:25
【问题描述】:
>>> 1, == (1,)
  File "<ipython-input-34-bddb0dd08d2c>", line 1
    1, == (1,)
        ^
SyntaxError: invalid syntax

为什么我会收到SyntaxError?控制台中的行指向比较运算符'=='。我试图比较 2 个元组。是的,(1,) == (1,) 有效。

这和这个……有关系吗?

    1,

Out[1]: (1,)
,1
Traceback (most recent call last):
File "<ipython-input-2-d73977cd7b2e>", line 1, in <module>
1("")
TypeError: 'int' object is not callable
def h():
print("hello from h")
h
Out[4]: <function __main__.h>
h()
hello from h
,h
Traceback (most recent call last):
File "<ipython-input-6-89db5d24b531>", line 1, in <module>
h("")
TypeError: h() takes 0 positional arguments but 1 was given
def h(""):
print("hello from h")
File "<ipython-input-7-e4606aaf3740>", line 1
def h(""):
^
SyntaxError: invalid syntax
def h(a):
print("hello from h")
,h
hello from h

我觉得这很有趣 - Python 3.6.3,不会发生在 2.7 或 3.5...

,ord A
Out[112]: 65

这有点难看。刚刚尝试了新的 IDE - Pycharm with python 3.6.3。控制台在 ",ord A" 上给了我语法错误,但 Spyder 3.3.1 没有。这与IPython有关吗? 7.2 在 ",ord A" >> 65 上给出相同的结果。

好的,2019 年 2 月 5 日。我好像掉进了黑洞。一个 IPython 黑洞。似乎我对控制台使用的另一种子语言 IPython 感到困惑。 IPython 中的 %Autocall '使函数无需键入括号即可调用'。尽管将 %Autocall 设置为 0 似乎仍会启用此行为。

【问题讨论】:

  • int 1 后面有一个逗号,这是无效的 python
  • 格式化导致 ^ 看似指向第一个等号,但控制台显示最后一个等号。
  • @aws_apprentice 我认为这不是 OP 的意图,而问题是为什么在这种情况下不能使用 a = 1,2 中的语法。
  • 这有帮助吗? 1, 1 == 1 >>> (1, True)
  • 对我来说很有意义。 1, 1 == 1 等价于 1, (1 == 1)

标签: python syntax tuples


【解决方案1】:

这是无效的语法。 Python 看到一个元组,其中包含从表达式 1== (1,) 创建的 2 个值。后者是一个不完整的表达式,所以你会得到一个错误。

参见Operator precedence table元组显示具有最高优先级,因此逗号之间的表达式在从结果创建元组对象之前执行。

所以是的,你可以只用逗号创建元组,但是每个组成部分必须是一个完整的表达式。如果您希望元组成为更大表达式的一部分,则无法在不使用括号的情况下创建元组。

这是因为对于不使用括号但包含逗号的 any 表达式,逗号将导致从逗号前后的子表达式创建一个元组 (可选后的部分)。使用括号来更改 Python 将其视为完整表达式的内容。所以如果你想比较两个不同的元组,你必须使用括号来区分两个元组,所以使用(1,) == (1,)。只要您删除任何一组括号,您就会创建一个包含更大表达式的单个元组(例如,(1,) == 1,(1,) == 1 相等测试创建一个单元素元组,从而产生(False,))。

【讨论】:

  • 'Binding or tuple display' 我想我不明白运算符的优先级。 ','(逗号)是运算符吗?如果我把 1 放在控制台中,它会吐回 (1,) - 所以它假设这是一个元组。 - (), = () 在控制台给我'ValueError:没有足够的值来解包(预期1,得到0)'
  • 1, 是一个元组,是的。 (), = () 是一个assignment statement,它尝试将单个值(空元组())分配给一个目标元组。这要求右手边是一个包含 1 个元素的可迭代对象,而这会失败。尚未确定您不能分配给空元组。在赋值中,最右边的 = 右边的表达式总是首先被评估,根据语句文档。
  • (1,) == 1, >>> Out[87]: (False,)
  • @JoePythonKing:是的,因为那是 (1,) == 1 在一个单元素元组中。
  • @JoePythonKing:同样,,最高优先级 操作。首先计算逗号前后的表达式(如果有的话),然后根据这些表达式的结果构造元组。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 2012-05-10
  • 2018-11-21
  • 2013-12-19
  • 2018-12-14
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多