大佬教程收集整理的这篇文章主要介绍了关于python中列表引用的非常简单的问题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个关于 Python 中引用的非常简单的问题。
我假设您对此很熟悉:
aa = [1,2] bb = aa aa[0] = 100 print(bb)
@H_673_9@如您所料,输出将是
[100,2]
@H_673_9@完全没问题✔
再举一个例子:l = [[],[],[]] a = l[0] l[0] = [1,2] print(a)
@H_673_9@但这里的输出是:
[]
@H_673_9@我知道为什么会这样。
这是因为,在第 3 行,我们制作了一个完全不同的列表并将其“替换”(不是更改而是替换)
l[0]
现在我的问题是“我可以以某种方式将
l[0]
替换为[1,2]
并保留a
作为参考吗?
P.S 不像
l[0].append(1,2)
解决方法
简短回答:不是真的,但可能有足够接近的东西。
问题是,在幕后,
a
是指向列表的指针,而l
是指向列表的指针列表。当您a = l[0]
时,实际上在 CPU 上转换为“取消引用指针l
,将结果内存区域视为列表对象,获取第一个对象(这将是另一个对象的地址)列表),并将指针a
的值设置为该地址”。一旦你这样做了,a
和l[0]
只是偶然相关;这是两个单独的指针,目前,它们指向同一个对象。如果您分配给任一变量,您正在更改指针的值,而不是指向对象的内容。从广义上讲,计算机实际上可以通过几种方式执行您的要求。
,
- 修改指向的对象(列表)而不修改任何一个指针。这就是
append
函数以及 Python 列表的许多其他修改器所做的。如果您想以更清楚地表达您的意图的方式执行此操作,您可以执行l[0][:] = [1,2]
。这是一个列表复制操作,复制到l[0]
和a
指向的对象中。这是您作为开发人员的最佳选择,但请注意,复制操作的复杂度为 O(n)。- 将
a
实现为指向列表的指针,在访问时会自动取消引用(仅指向列表的指针)。这不是,AFAIK,Python 提供任何支持;几乎没有语言可以。在 C 中,您可以说list ** a = &(l[0]);
,但是任何时候您想用a
实际执行任何操作时,您都必须改用*a
。- 告诉解释器注意
a
是l[0]
的别名,而不是它自己的独立变量。据我所知,Python 也不支持这个。在 C 中,您可以将其作为#define a (l[0])
来执行,尽管您希望在超出范围时#undef a
。- 与其将
a
设为列表变量(实现为指向列表的指针),不如将其设为函数:a = lambda: l[0]
。这意味着您必须在任何想要获取a()
的实际内容的地方使用a
而不是l[0]
,并且您不能通过 {{1} 分配给l[0]
}(或直接通过a()
)。但它确实有效,在 Python 中。您甚至可以使用属性,这可以让您跳过括号并通过a
进行分配,但代价是编写更多代码来包装列表(我不知道有什么方法将属性直接附加到列表(尽管可能存在),因此您必须创建一个包含列表的新对象)。如果 a = l 那么在这种情况下调用 a[0] 将产生 [1,2],但是,您正在删除“a”所引用的列表,因此引用也被销毁。您需要使 a = l 并调用 a[0] 或通过再次调用 a = l[0] 来重置引用。
,l[0] 处的原始数组和 [1,2] 数组是两个不同的对象。一旦更改完成,除了将 a 变量重新分配给 l[0] 之外,没有办法做到这一点。
大佬总结
以上是大佬教程为你收集整理的关于python中列表引用的非常简单的问题全部内容,希望文章能够帮你解决关于python中列表引用的非常简单的问题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。