在python中分配到同一行的多个变量

时间:2017-12-16 07:01:56

标签: python numpy jupyter-notebook

我正在使用Jupyter Notebook for Python并使用Numpy Lib。 这是我试过的

import numpy as np
arr = np.arange(10, 21)
print(arr)
slice_arr = arr[:5]= 6
print(slice_arr)
print(arr)

输出是:

[10 11 12 13 14 15 16 17 18 19]
6
[ 6  6  6  6  6 15 16 17 18 19]

但我认为 slice_arr 将是[ 6 6 6 6 6]因为我从 arr 获得前5个元素,并将6分配给所有5个元素然后分配给 slice_arr

如何执行此声明以及 slice_arr 值如何6

6是否分别分配给arr [:5]和slice_arr

如果从右到左分配,则slice_arr应为[ 6 6 6 6 6]

提前致谢

2 个答案:

答案 0 :(得分:3)

https://docs.python.org/3/reference/simple_stmts.html#assignment-statements

  

赋值语句计算表达式列表(请记住,这可以是单个表达式或以逗号分隔的列表,后者产生元组)并将单个结果对象从左到右分配给每个目标列表。

为了得到你想要的,也许这样做:

slice_arr = arr [:5] = np.zeros([5])+ 6

答案 1 :(得分:2)

这样的多项任务并不常见,不鼓励(没有充分理由):

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])

idxarr[:idx]表达式中使用之前被赋值。这只能起作用,因为分配是从左到右执行的(在评估RHS之后)。

assignment文档中,正式语言表达式为:

https://docs.python.org/3/reference/simple_stmts.html#assignment-statements

  

assignment_stmt :: =(target_list" =")+(starred_expression | yield_expression)