微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么列表copy向在python中包含自身的数组添加额外的维度?

如何解决为什么列表copy向在python中包含自身的数组添加额外的维度?

我正在尝试使用列表中的列表,但我发现此属性非常奇怪,无法真正理解发生这种情况的原因:

因此,当python在打印时确定列表包含自身时,将使用以下表示法:[[...]]

然后我创建了一个简单的程序来打印该行:

arr = []
arr.append(arr)
print(arr)

输出

[[...]]

然后我走得更远,并将列表追加两次,毫不奇怪,我得到了一个包含两个包含自身的元素的数组:

arr = []
arr.append(arr)
print(arr)
print('********')
arr.append(arr)
print(arr)

输出

[[...]]
********
[[...],[...]]

在那之后,我决定看看这些无限数组的浅表是什么样子,我感到非常惊讶,无法解释这种现象:

arr = []
arr.append(arr)
print(arr)
print(arr.copy())
print('********')
arr.append(arr)
print(arr)
print(arr.copy())

输出

[[...]]
[[[...]]]
********
[[...],[...]]
[[[...],[...]],[[...],[...]]]

这是怎么回事?这会产生额外的尺寸?

在我看来,从几何学上来说,好像copy()创建了与原始数组相同的结构,然后在应该放置元素引用的地方,实际上放置了整个原始对象的引用!

我的意思是

对于第一个元素,让我们假设对象[[...]] 的引用为0x11AA,因此,copy将其结构创建为原始结构的副本(例如,星号作为对象引用的可见占位符,例如) :[*]一个包含一个元素的列表),然后,它为星号提供对象[[...]] 的引用,得到[[[...]]]

第二,复制的结构看起来像:[*,*]一个包含两个元素的列表),然后,将整个对象[[...],[...]]的引用赋予每个元素(星号)。

为什么这样?

我真的很困惑,不明白为什么会有这种行为?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。