代码之家  ›  专栏  ›  技术社区  ›  Abu Yousuf

在python中分配到同一行中的多个变量[重复]

  •  1
  • Abu Yousuf  · 技术社区  · 7 年前

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

    但我想 切片arr 可能是 [ 6 6 6 6 6] 因为我从 和分配 6 分配给所有5个元素,然后分配给 切片arr

    该语句将如何执行以及如何执行 切片arr 值为 6. ?

    分别分配给arr[:5]和 slice_arr ?

    如果赋值是从右向左的,那么 切片arr 应该是 [ 6 6 6 6 6]

    提前感谢

    2 回复  |  直到 7 年前
        1
  •  3
  •   Gavin Haynes Kevin Ennis    7 年前

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

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

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

    切片arr=arr[:5]=np。零([5])+6

        2
  •  2
  •   hpaulj    7 年前

    像这样的多次作业并不常见,也不鼓励(没有充分的理由):

    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 ,右侧的值。

    这个 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 docs,形式语言表达为:

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