python 列表互相嵌套 内存是怎么实现的

发布于 2022-09-02 13:35:25 字数 449 浏览 10 评论 0

p = [1,2]
t = ["a","b"]
t.append(p)
t
['a', 'b', [1, 2]]
p.append(t)
p
[1, 2, ['a', 'b', [...]]]
t
['a', 'b', [1, 2, [...]]]
p[2][2] == p
True
t[2][2] == t
True
t[2] == p
True

如上述 两个列表互相嵌套对方,可以无限index下去 p22........
这个在内存是怎么怎么实现的

————————————补充——————————————
看了下append的处理,append函数没有返回值,用id查地址也是一样的,也就是说没有拷贝

t = [1,2]
id(t)
4324227016
t.append("3")
t
[1, 2, '3']
id(t)
4324227016

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

静若繁花 2022-09-09 13:35:25

因为赋值过去的是引用,python对象默认赋值是引用

|煩躁 2022-09-09 13:35:25

有几个关键点可能需要注意:

  • List是基于c链表实现的.

  • List是可变对象,也就是说,对象的地址与元素的地址,并没有直接关系

  • 变量名其实只是一个指向某个对象的字符串, 它指向一个对象,但是并不代表内存地址。而id(p)只是获取了P所指向的对象地址

比如假设P指向list对象地址为ap, t所指向list地址为at。则第一次t.append(p)时,t的对象的内存形式模拟如下:

at  =>  'a', 'b', ap所指向的对象地址

在来一个p.append(t)那么此时p的对象内存形式:

ap => 1, 2, at所指向的对象地址

这时候,嵌套就发生了。产生无限序列。所以说,python里面变量名也就是p,t他们作用不大,真中有用的是他们指向的目标对象,即ap, at.

十年不长 2022-09-09 13:35:25

你的每一次的append都是拷贝一份,而不是引用啊,所以可以无限制

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文