【问题标题】:Python: What exactly is meant by an "array" in Python? [closed]Python:Python 中的“数组”到底是什么意思? [关闭]
【发布时间】:2020-09-26 11:14:15
【问题描述】:

在我的 Python 课程中,我读到了这些句子:

"赋值:list2 = list1 复制数组的名称,而不是其内容。实际上,这两个名称 (list1 and list2) 标识计算机内存中的相同位置。修改其中一个会影响其他,反之亦然。"

Cisco Networking Academy 上提供的资源 - 课程名称:PCAP - Programming Essentials in Python - 模块 3,第 3.1.6.1 章,标题为“列表的内在生命”。完全在下面您会遇到第 3.1.6.1 章的完整文本。

在第 3.1.6.1 章中,作者解释了列表是什么以及它的功能。我上面提到的段落提出了我如何才能最好地可视化“数组”的问题。我可以将“数组”视为仅指向列表的链接吗? “数组”本身是一个空实体吗?


第 3.1.6.1 章全文:

列表的内在生命

现在我们想向您展示列表的一个重要且非常令人惊讶的特性,该特性将它们与普通变量区分开来。

我们希望您记住它 - 它可能会影响您未来的程序,如果忘记或忽视它可能会导致严重的问题。

看看编辑器中的sn-p。

list1 = [1]
list2 = list1
list1[0] = 2
print(list2)

程序:

——创建一个名为list1的单元素列表; – 将其分配给名为list2 的新列表; – 更改list1 的唯一元素; – 打印出list2。

令人惊讶的部分是程序将输出:[2],而不是 [1],这似乎是显而易见的解决方案。

列表(以及许多其他复杂的 Python 实体)以不同于普通(标量)变量的方式存储。

你可以这样说:

——普通变量的名称就是其内容的名称; – 列表的名称是存储列表的内存位置的名称。 再读一遍这两行 - 区别对于理解我们接下来要讨论的内容至关重要。

赋值:list2 = list1 复制数组的名称,而不是其内容。实际上,这两个名称 (list1 and list2) 标识计算机内存中的相同位置。修改其中一个会影响另一个,反之亦然。

【问题讨论】:

  • 抱歉你的问题不清楚:一个数组(实际上是一个列表)是一个容器。它可以包含任何东西。将数组与 URL 的函数进行比较是什么意思?
  • 这是一个很奇怪的描述。 Python 没有数组(在一个不起眼的模块和第三方扩展之外)。名字永远不会被复制,他们不是头等舱。内存布局是一个实现细节。等等……
  • 感谢您的回复。我认为数组和列表是两个不同的东西。当我阅读 Python 课程的文本时,看起来 list2 本身是空的。 List2 仅指 list1。这就是为什么我认为数组是某种链接或地址...
  • 您的问题需要独立。如果我们没有这本书,告诉我们代码在书的哪一章对我们没有好处。您需要包含代码in your question。

标签: python arrays python-3.x


【解决方案1】:

发生这种情况的原因是一种称为指针的东西。

指针只是指向内存中某个位置的变量。这就是 python 列表的工作方式。当你设置

foo = [1,2,3,4,5]

python 将 foo 的值 不是 设置为实际列表,而是设置为计算机中存储实际列表的内存位置。因此, foo 是一个指针 - 一个具有内存位置的变量。

所以,当你然后设置

bar = foo

这会将 bar 设置为 foo 存储的内存位置。 Foo 和 bar 现在都设置为 same 内存位置。

结果,如果你接着说:

bar.append(6)

存储在该内存位置的值已更改。所以现在如果你说

print(foo)

这将打印 [1,2,3,4,5,6]。

这是一个简化的解释。希望我能帮上忙!

编辑

此外,典型数组和 python 列表之间存在差异。最重要的区别是数组的长度不能改变,即没有追加。您只能更改数组元素的值。

在 python 列表中,您可以随意调整列表的大小。

【讨论】:

    【解决方案2】:

    您的第一个语句意味着新列表list2 是对list1 的引用
    编辑:list2 实际上不是一个新列表,它是对@987654324 的引用@
    检查这个:

    list1 = [1,2,3]
    list2 = list1
    print("List1 = ",list1,"List2 = ",list2)
    

    给:

    List1 = [1,2,3] List2 = [1,2,3]
    

    和

    list1 = [1,2,3]
    list2 = list1
    list2[0] = 4
    print("List1 = ",list1,"List2 = ",list2)
    

    给:

    List1 = [4,2,3] List2 = [4,2,3]
    

    在这种情况下,对第二个 list 所做的任何更改都会反映在第一个列表中,因为您实际上是在使用不同的名称更改同一个对象
    您应该使用复制模块来创建一个新对象:

    import copy
    list1 = [1,2,3]
    list2 = copy.deepcopy(list1)
    print("List1 = ",list1,"List2 = ",list2)
    list2[0] = 4
    print("List1 = ",list1,"List2 = ",list2)
    

    给:

    List1 = [1,2,3] List2 = [1,2,3]
    List1 = [1,2,3] List2 = [4,2,3]
    

    【讨论】:

    • 不客气,喜欢的可以采纳答案。
    • 我想接受你的回答,但我还没有足够的声望点。
    • 这是相当误导的。前几个代码 sn-ps 中没有“新”、“第一”或“第二”列表。只有一个有两个名字的列表。
    • 不过我觉得比较容易参考
    【解决方案3】:

    很好的问题。您正在寻找术语aliasing。还可以看看id 函数,它可以帮助你内化这个想法。出于我们的目的,id() 返回变量的唯一标识。

    如果您的课程正确,我们希望两个列表具有相同的id。像这样:

    >>> numbers1 = [1, 2, 3]
    >>> id(numbers1)
    140675313832392
    >>> numbers2 = numbers1
    >>> id(numbers2)
    140675313832392
    

    你的课程确实是对的。

    我可以将数组与 URL 的函数进行比较吗?如果不是,描述数组的最佳方式是什么?

    我认为您只是将概念缩小到数组,这将是一个错误。这同样适用于 Python 中的所有变量。证明?例如,尝试使用整数进行 id 实验。

    希望对你有帮助,祝你好运!

    【讨论】:

    • 感谢您的 cmets,桑杰!您的 cmets 帮助我掌握了这个概念!
    • @Floris 考虑为后代澄清这个问题 :)
    • 我当然可以调整我的问题,桑杰。我想知道数组到底是什么。 Python 课程中关于数组的文本对我来说不是很清楚。我怎样才能最好地改变它?建议:“Python:数组到底是什么?”
    • "将一个变量赋值给另一个变量会发生什么?"
    猜你喜欢
    • 2017-01-05
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2017-08-07
    • 2017-07-20
    • 2014-09-23
    相关资源
    最近更新 更多