Jos*_*n H 3 python syntax syntax-error
为什么下一个python行不是语法错误?如果它真的不是那么我怎么能用它,在哪种情况下它会有用?
a= range(10)[1:3]=[2,3]
Run Code Online (Sandbox Code Playgroud)
Python支持同一行上的多个赋值:
>>> a = b = c = 2
>>> a
2
>>> b
2
>>> c
2
Run Code Online (Sandbox Code Playgroud)
因为你要将第一个分配给一个列表(python中的一个可变对象),然后将该列表的两个部分(这是可变的)和a分配给第三个项目的内容,python就可以了.如果你用不可变的东西替换了你的中间值,你会得到一个错误.
>>> a = 'foo' = 'bar'
File "<input>", line 1
SyntaxError: can't assign to literal
>>> a = {}['foo'] = 'bar'
>>> a
'bar'
Run Code Online (Sandbox Code Playgroud)
有趣的是,像这样的行仍然会抛出错误,因为您试图将值3和4分配给文字值1和2.
>>> a = [1, 2] = [3, 4]
File "<input>", line 1
SyntaxError: can't assign to literal
Run Code Online (Sandbox Code Playgroud)
虽然这不是:
>>> a = [1, 2][:] = [3, 4]
>>> a
[3, 4]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,关键是通过使用切片表示法,您将分配到列表内部的范围,而不是重新分配到列表中的文字值.
另外,线条
>>> a = [[], []] = [{}, {}]
>>> a
[{}, {}]
Run Code Online (Sandbox Code Playgroud)
和
>>> a = [b, c] = 3, 4
>>> b
3
>>> c
4
Run Code Online (Sandbox Code Playgroud)
是有效的,第一个是因为内部列表和dicts都是可变的和可迭代的,第二个是因为你将3和4分配给变量b和c而不是文字(感谢Sven:D).
编辑回答操作的最终问题.
>>> a = 1
>>> b = 2
>>> a,b = b,a = a,b
>>> a
2
>>> b
1
Run Code Online (Sandbox Code Playgroud)
这只是归结为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'
Run Code Online (Sandbox Code Playgroud)
令人困惑的是,但我解释这一点的方式是,在语句结束之前,a和b不会被重新评估/分配新值,因此重要的分配是最右边的分配.如果最后一个语句是a,b = a,b或b,则a = b,a,a和b的值不会改变.如果是a,b = b,a或b,a = a,b,则切换值.