关于python中列表引用的一个非常简单的问题

关于python中列表引用的一个非常简单的问题,python,list,reference,Python,List,Reference,关于python中的引用,我有一个非常简单的问题 我想你对此很熟悉: aa = [1,2] bb = aa aa[0] = 100 print(bb) 正如您可能猜到的,输出将是 [100, 2] 完全没关系✔ 让我们再举一个例子: l = [[],[],[]] a = l[0] l[0] = [1,2] print(a) 但这里的输出是: [] 我知道为什么会这样 这是因为,在第3行,我们制作了一个完全不同的列表,并将其替换为l[0] 现在我的问题是,我是否可以用[1,2]替换l[0

关于python中的引用,我有一个非常简单的问题

我想你对此很熟悉:

aa = [1,2]
bb = aa
aa[0] = 100
print(bb)
正如您可能猜到的,输出将是

[100, 2]
完全没关系✔

让我们再举一个例子:

l = [[],[],[]]
a = l[0]
l[0] = [1,2]
print(a)
但这里的输出是:

[]
我知道为什么会这样

这是因为,在第3行,我们制作了一个完全不同的列表,并将其替换为l[0]

现在我的问题是,我是否可以用[1,2]替换l[0],并保留a作为引用


p.S与l[0]不同。附录1,2

l[0]处的原始数组和[1,2]数组是两个不同的对象。只有在进行更改后,将a变量重新分配给l[0]才能完成此操作。

l[0]处的原始数组和[1,2]数组是两个不同的对象。如果a=l,那么在这种情况下调用a[0]将产生[1,2],但是,您正在删除“a”引用的列表,因此引用也将被销毁。您需要使a=l并调用a[0],或者通过再次调用a=l[0]重置引用。

如果a=l,那么在这种情况下调用a[0]将产生[1,2],但是,您正在删除“a”正在引用的列表,因此引用也会被销毁。您需要设置a=l并调用a[0],或者通过再次调用a=l[0]重置引用。

简短回答:不太可能,但可能有足够接近的地方

问题是,在封面下,a是指向a-list的指针,l是指向a-list-of-pointers-to-list的指针。当a=l[0]时,在CPU上实际转换为解引用指针l,将产生的内存区域视为列表对象,获取第一个对象,该对象将是另一个列表的地址,并将指针a的值设置为该地址。一旦你这样做了,a和l[0]之间的关系就只有简洁了;这是两个单独的指针,它们暂时指向同一个对象。如果为任一变量赋值,则更改的是指针的值,而不是指向对象的内容

广义地说,有几种方法可以让计算机实际执行你的要求

修改指向的对象列表,而不修改任何一个指针。这就是append函数所做的,以及python列表的许多其他变体。如果您想以更清楚地表达您的意图的方式来执行此操作,您可以执行l[0][:]=[1,2]。这是一个列表复制操作,复制到l[0]和a都指向的对象中。这是您作为开发人员的最佳选择,不过请注意,复制操作是打开的。 将实现作为指向列表的指针,该指针在访问时仅自动取消引用为指向列表的指针。这不是Python提供的任何支持;几乎没有任何语言能做到这一点。在C语言中,你可以说list**a=&l[0];但是当你想用a做任何事情的时候,你就必须用*a来代替。 告诉解释器注意a是l[0]的别名,而不是它自己的独立变量。据我所知,Python也不支持这一点。在C中,您可以定义一个l[0],尽管您希望在a超出范围时取消定义它。 与其将列表变量作为指向列表的指针来实现,不如将其作为函数:a=lambda:l[0]。这意味着您必须在任何想要获取l[0]的实际内容的地方使用a而不是a,并且不能通过a或直接通过a分配给l[0]。但在Python中,它确实有效。您甚至可以使用属性,这将允许您跳过括号并通过指定,但是以编写更多代码来包装列表为代价,我不知道如何将属性直接附加到列表,尽管可能存在,因此您必须创建一个包装列表的新对象。
简短的回答:不是真的,但可能有足够接近的东西

问题是,在封面下,a是指向a-list的指针,l是指向a-list-of-pointers-to-list的指针。当a=l[0]时,在CPU上实际转换为解引用指针l,将产生的内存区域视为列表对象,获取第一个对象,该对象将是另一个列表的地址,并将指针a的值设置为该地址。一旦你这样做了,a和l[0]之间的关系就只有简洁了;这是两个单独的指针,它们暂时指向同一个对象。如果为任一变量赋值,则更改的是指针的值,而不是指向对象的内容

广义地说,有几种方法可以让计算机实际执行你的要求

修改指向的对象列表,而不修改任何一个指针。这就是append函数所做的,以及python列表的许多其他变体。如果你想用一种可能 更清楚地表达您的意图,您可以执行l[0][:]=[1,2]。这是一个列表复制操作,复制到l[0]和a都指向的对象中。这是您作为开发人员的最佳选择,不过请注意,复制操作是打开的。 将实现作为指向列表的指针,该指针在访问时仅自动取消引用为指向列表的指针。这不是Python提供的任何支持;几乎没有任何语言能做到这一点。在C语言中,你可以说list**a=&l[0];但是当你想用a做任何事情的时候,你就必须用*a来代替。 告诉解释器注意a是l[0]的别名,而不是它自己的独立变量。据我所知,Python也不支持这一点。在C中,您可以定义一个l[0],尽管您希望在a超出范围时取消定义它。 与其将列表变量作为指向列表的指针来实现,不如将其作为函数:a=lambda:l[0]。这意味着您必须在任何想要获取l[0]的实际内容的地方使用a而不是a,并且不能通过a或直接通过a分配给l[0]。但在Python中,它确实有效。您甚至可以使用属性,这将允许您跳过括号并通过指定,但是以编写更多代码来包装列表为代价,我不知道如何将属性直接附加到列表,尽管可能存在,因此您必须创建一个包装列表的新对象。
你的第一句话令人困惑,有点离题。你可能只想在你的回答中删除这一行。你的第一句话令人困惑,而且有点离题。您可能希望在响应中删除该行。