繁体   English   中英

Python如何在列表内交换元素?

[英]How Does Python Swap Elements inside a List?

我是Python的新手,并且刚刚了解了可变和不可变的对象。 似乎当我们交换列表中的元素时,Python创建单个元素的副本,然后将它们复制回到列表中。

在此处输入图片说明

在上面的示例中,我们从n = [[1, 2], [3, 4]] 第一个子列表[1, 2]占据ID# 24 ,第二个子列表[3, 4]占据ID# 96 起初,我认为由于列表是可变的,因此在交换之后,ID# 24保持[3, 4] ,ID# 96保持[1, 2] 但是正如我们在上面的测试中看到的,情况并非如此。 相反,Python以我们交换决定的方式指向对象。 列表的第一个插槽指向96 ,第二个插槽指向24

当然, n的ID#不会改变,因此n不会违反可变对象的定义。 但是子列表的交换方式似乎是一个警告。 您能否以更精确的语言进行确认或解释?

您误认为ID。 ID#24是列表[1,2]的ID。 它不是n中索引0的内存地址或ID。

您可能想尝试一个类似的示例来确认:

>>> x = [1, 2]
>>> id(x)
4332120256
>>> l = [x, 3]
>>> id(l[0])
4332120256
>>> 

文档中

将对象分配给目标列表的定义如下。

如果目标列表是单个目标:将对象分配给该目标。 如果目标列表是目标的逗号分隔列表:该对象必须是可迭代的,并且具有与目标列表中存在目标的项目数量相同的项目,并且这些项目从左到右分配给相应的目标。

如果仔细阅读,将会发现您有这种情况:

target_list = expression_list

表达式列表首先计算,并且评估成元组:

一个赋值语句评估表达式列表(请记住,它可以是单个表达式或逗号分隔的列表,后者产生一个元组)

因此,如果您有:

a = [1, 2]
a[1], a[0] = a[0], a[1]

它实际上就像编写以下内容:

a = [1, 2]
temp = (a[0], a[1]) # Expression list evaluates to tuple.

# target_list assignment to corresponding elements from expression list.
a[1] = temp[0]
a[0] = temp[1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM