程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了关于python中列表引用的非常简单的问题大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决关于python中列表引用的非常简单的问题?

开发过程中遇到关于python中列表引用的非常简单的问题的问题如何解决?下面主要结合日常开发的经验,给出你关于关于python中列表引用的非常简单的问题的解决方法建议,希望对你解决关于python中列表引用的非常简单的问题有所启发或帮助;

我有一个关于 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]


现在我的问题是“我可以以某种方式将 l[0] 替换为 [1,2] 并保留 a 作为参吗?


P.S 不像 l[0].append(1,2)

解决方法

简短回答:不是真的,但可能有足够接近的东西。


问题是,在幕后,a 是指向列表的指针,而 l 是指向列表的指针列表。当您 a = l[0] 时,实际上在 CPU 上转换为“取消引用指针 l,将结果内存区域视为列表对象,获取第一个对象(这将是另一个对象的地址)列表),并将指针 a 的值设置为该地址”。一旦你这样做了al[0] 只是偶然相关;这是两个单独的指针,目前,它们指向同一个对象。如果您分配给任一变量,您正在更改指针的值,而不是指向对象的内容。

从广义上讲,计算机实际上可以通过几种方式执行您的要求。

  1. 修改指向的对象(列表)而不修改任何一个指针。这就是 append 函数以及 Python 列表的许多其他修改器所做的。如果您想以更清楚地表达您的意图的方式执行此操作,您可以执行 l[0][:] = [1,2]。这是一个列表复制操作,复制到 l[0]a 指向的对象中。这是您作为开发人员的最佳选择,但请注意,复制操作的复杂度为 O(n)。
  2. a 实现为指向列表的指针,在访问时会自动取消引用(仅指向列表的指针)。这不是,AFAIK,Python 提供任何支持;几乎没有语言可以。在 C 中,您可以说 list ** a = &(l[0]);,但是任何时候您想用 a 实际执行任何操作时,您都必须改用 *a
  3. 告诉解释器注意 al[0] 的别名,而不是它自己的独立变量。据我所知,Python 也不支持这个。在 C 中,您可以将其作为 #define a (l[0]) 来执行,尽管您希望在超出范围时 #undef a
  4. 与其将 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,请注明来意。
标签: