【问题标题】:assign into multiple variable in same line in python [duplicate]在python的同一行中分配给多个变量[重复]
【发布时间】:2017-12-16 07:01:55
【问题描述】:

我正在使用 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]

提前致谢

【问题讨论】:

    标签: python numpy jupyter-notebook


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答。
    • 我不知道left to right 是语法的正式部分。这是有道理的,尽管在大多数情况下它不应该有所作为。
    【解决方案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])
    

    idx 在用于arr[:idx] 表达式之前被赋值。这只有效,因为分配是从左到右执行的(在评估 RHS 之后)。

    来自assignment 文档,正式的语言表达是:

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

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

    【讨论】:

    • 感谢您的回答。所以这里最右边的值6 分别分配给arr[:5]slice_arr,我说得对吗@hpaulj?
    • @AbuYousuf,对。 expression list(在@Gavin 的参考中)被评估一次,对targets 的分配是单独完成的。我添加了一个示例,显示 target 分配从左到右发生(在您的情况下,slice_arr 首先分配了 6)。
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    相关资源
    最近更新 更多