【问题标题】:Get a part of a list and change the original when the new list changes [duplicate]获取列表的一部分并在新列表更改时更改原始列表[重复]
【发布时间】:2017-12-22 15:24:50
【问题描述】:

我想知道是否可以这样做:

a = [0, 1, 2, 3, 4]
b = a[2:]
b[0] = -1
print(a)
print(b)

然后得到这个:

[0, 1, -1, 3, 4]
[-1, 3, 4]

通常,你会得到这个:

[0, 1, 2, 3, 4]
[-1, 3, 4]

【问题讨论】:

  • 您的问题不清楚...您提供了一个代码及其输出,现在,您希望它喜欢做什么,而它目前不这样做?
  • 那么你想让ab指向同一个列表对象并一起更新吗?
  • 是的,我愿意。问题是,当您对原始列表进行切片时,您会得到一份副本。当我改变'b'时我需要改变'a'。
  • print(a)之前加一行a[2] = -1?
  • @downshift 他显然不想硬编码。他希望自动更新。

标签: python list python-3.x


【解决方案1】:

不,使用普通的lists 这是不可能的,因为切片会返回切片的浅表副本。

但是,如果您有 NumPy,这是可能的,因为 array 的切片返回视图而不是副本:

import numpy as np
a = np.array([0, 1, 2, 3, 4])
b = a[2:]
b[0] = -1
print(a)   # [ 0  1 -1  3  4]
print(b)   # [-1  3  4]

【讨论】:

    【解决方案2】:

    简要说明我对此的理解,如果我犯了任何错误,请告诉我。

    答案是否定的。

    在python中,变量是链接到对象的标签。 如果我们这样做

    a = [0, 1, 2, 3, 4]
    b = a
    id(a) #199598920
    id(b) #199598920
    

    b 只是一个与对象关联的名称标签名称。它与a 共享同一个对象


    对于你的问题,

    a = [0, 1, 2, 3, 4]
    id(a) #199598920
    a[2:] # [2, 3, 4]
    id(a[2:]) #199581576
    

    a[2:] 通过创建一个新列表并将第一个列表的一部分复制到新列表中,为我们提供了列表的一部分。

    在这种情况下,您无法自动更新您的b[0] 并列出a

    【讨论】:

    • 我明白了。这是不可能的,我需要编码。谢谢!
    • 比较原始和切片的id 并不确定——因为即使它们共享底层“数据”,id 也必须不同(仅仅是因为一个实例不能代表自身和自身的一部分)。否则很好的答案 - 我真的很喜欢这些图片! :)
    【解决方案3】:

    你的意思是这样的吗? ;)

    a = [0, 1, 2, 3, 4]
    b = a[2:]
    b[0] = a[2] = -1 
    print(a)
    print(b)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多