这样的多重分配并不常见,也不鼓励(没有充分的理由):
slice_arr = arr[:5]= 6
将像数字这样的不可变对象分配给多个变量很好:
In [215]: x = y = 10
应谨慎分配像数组或列表这样的可变对象:
In [216]: x = y = [1,2,3]
In [217]: x[0]=12
In [218]: y
Out[218]: [12, 2, 3]
[216] 的简单解释是同一个列表被分配给两个变量。
虽然我以前没有见过你的表情,但我认为slice_arr 将是6,即 RHS 上的值。
arr[:5] = 6 执行为arr.__setitem(slice(None,5), 6),即对arr 的方法调用。
可以想象,解释器也可以执行slice_arr = arr.__getitem__(slice(None,5)),但如果执行slice_arr = 6,它会更简单(并且更少歧义)。也就是说,将相同的东西分配给两个对象,而不是链接操作。
另一种看待这个问题的方式是,6 的复制是在arr 内完成的,或者是arr 变异过程的一部分。它在分配之前不会被复制。 numpy 在 Python 中运行。 Python 解释器解析代码,将其转换为函数和方法调用。
这是一个列表示例
In [235]: x=[1,2,3]
In [236]: y = x[1:] = [3,4,5]
In [237]: y
Out[237]: [3, 4, 5]
In [238]: x
Out[238]: [1, 3, 4, 5]
文档说target 分配是从左到右完成的。我认为这说明了:
In [43]: alist = alist[2:] = [1,2,3]
In [44]: alist
Out[44]: [1, 2, 1, 2, 3]
alist首先获取值[1,2,3],然后切片(最后一个元素)被同一个列表替换。
从左到右赋值有点人为的数组示例:
In [45]: arr = np.arange(10)
In [46]: idx = arr[:idx] = 6
In [47]: idx
Out[47]: 6
In [48]: arr
Out[48]: array([6, 6, 6, 6, 6, 6, 6, 7, 8, 9])
In [49]: idx = arr[:idx] = 4
In [50]: arr
Out[50]: array([4, 4, 4, 4, 6, 6, 6, 7, 8, 9])
idx 在用于arr[:idx] 表达式之前被赋值。这只有效,因为分配是从左到右执行的(在评估 RHS 之后)。
来自assignment 文档,正式的语言表达是:
https://docs.python.org/3/reference/simple_stmts.html#assignment-statements
assignment_stmt ::= (target_list "=")+ (starred_expression | yield_expression)