python - 为什么这条 python 行不是错误?

标签 python syntax syntax-error

为什么下一个 python 行不是语法错误?如果真的不是那么我该如何使用它以及在什么情况下它会有用?

 a= range(10)[1:3]=[2,3]

最佳答案

Python 支持在同一行上进行多项赋值:

>>> a = b = c = 2
>>> a
2
>>> b
2
>>> c
2

由于您将 first 分配给列表(python 中的可变对象),然后将该列表的两个部分(可变对象)和 a 分配给第三项的内容,python 可以接受。如果您将中间值替换为不可变的值,则会出现错误。

>>> a = 'foo' = 'bar'
  File "<input>", line 1
SyntaxError: can't assign to literal

>>> a = {}['foo'] = 'bar'
>>> a
'bar'

有趣的是,像这样的一行仍然会抛出错误,因为您正试图将值 3 和 4 分配给文字值 1 和 2。

>>> a = [1, 2] = [3, 4]
  File "<input>", line 1
SyntaxError: can't assign to literal

虽然这不是:

>>> a = [1, 2][:] = [3, 4]
>>> a
[3, 4]

本例中的关键是,通过使用切片表示法,您将分配给列表内部的范围,而不是重新分配给列表中的文字值。

另外,线条

>>> a = [[], []] = [{}, {}]
>>> a
[{}, {}]

>>> a = [b, c] = 3, 4
>>> b
3
>>> c
4

是有效的,第一个是因为内部列表和字典都是可变的和可迭代的,第二个是因为您将 3 和 4 分配给变量 b 和 c 而不是文字(感谢 Sven :D)。

编辑以回答运算符(operator)的最后一个问题。

>>> a = 1
>>> b = 2
>>> a,b = b,a = a,b
>>> a
2
>>> b
1

这归结为 b 的最终(最右边)赋值,a = a, b。观察:

>>> a, b = 'a', 'b'
>>> a, b = b, a = a, b = b, a
>>> a
'b'
>>> b
'a'
>>> a, b = b, a = b, a
>>> a
'a'
>>> b
'b'

这很令人困惑,但我的解释是,在语句完成之前,a 和 b 不会重新计算/分配新值,因此重要的分配是最右边的那个。如果最后一条语句是 a, b = a, b or b, a = b, a, a and b's values don't change.如果是 a, b = b, a 或 b, a = a, b, 则交换值。

关于python - 为什么这条 python 行不是错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050374/

相关文章:

C++ Sieve of Eratosthenes 错误 - 需要帮助修复语法

syntax-error - TI-84 Plus 电阻程序语法错误

javascript - 我到目前为止还没有见过这种 JavaScript 语法,它到底有什么作用?

python - detectron 2 输出的类标签指的是什么?

Python:将 Unicode-Hex-String 转换为 Unicode

python - 查找在指定时间内条目出现频率最高的系列范围(在 Pandas 中)

java - 需要对此 Java 语法的解释

perl - 为什么Perl不让我从后缀比较中链接后缀循环?

linux - Bash shell "Join"命令无法识别操作数

解析元组的 Pythonic 方式