[英]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.