为什么一行中的多个列表值赋值不会更改列表中的相应值?

2024-06-02 06:09:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在计算机科学测试中,我被要求确定此代码的输出:

L = [12, 3, 1, 5, 13, 18, 85, 10, 2, 74, 1, 12, 3]
i = 1
while i < len(L):
    L[i-1], L[i] = L[i], L[i-1]
    i += 2
print(L)

代码看起来很简单,但有一点让我困惑,让我的答案错了,这就是第4行的代码

让我们举一个例子,让您了解我是如何理解这行代码的: 让我们假设i=1。
那么L[0],L[1]=L[1],L[0]

这意味着L[0]=L[1](L[0]将是3)和L[1]=L[0](这里我认为这个赋值是无用的,因为L[0]现在等于L[1]=3)

然而,当我回家用笔记本电脑执行代码时,我意识到我错了,但我仍然不明白我的错误

顺便说一句,我想可能是第4行的语法(一行中有2个作业)


Tags: 答案代码len错误作业语法例子笔记本电脑
2条回答

因此,这实际上是python的一个特性,称为多重赋值,如果您来自其他语言,有时很难掌握。这就是它的工作原理

例如a, b = b, a

这段代码实际上会交换元素。我将给出一个简单直观的解释,然后是一个更专业的解释

  1. 首先评估RHS,然后将值分别分配给LHS上的变量(标签)
  2. 因此,实际上可以在python中将元组(a,b)定义为a,b,括号只是为了更好的可读性。因此,您的RHS是一个解包的元组,每个元素分别分配给LHS上的每个标签。因此,以下所有代码片段都是等效的
a, b = b, a
a, b = (b, a)
a, b = [b, a]

有关更详细的解释,请参阅thisSO帖子

注意:python中变量的概念与其他语言非常不同,在其他语言中,变量是某种类型的容器,用于存储该类型的值。在python中,标签是一个比变量更正确的术语,因为您只是用这个名称标记一个对象,并且该对象可以是任何数据类型。因此,为了理解这段代码,您实际上不是在交换值,而是在交换标签 因此,python首先查找标签ba在RHS上指向的值,将这些值放在那里,然后只给这些值添加新标签

我希望这能把事情弄清楚

您的代码是交换列表中成对的相邻元素

L[i-1], L[i] = L[i], L[i-1] -Python中的这种表示法交换了L[i-1]L[i]的内容

要更好地理解它,请参阅:https://docs.python.org/3/reference/expressions.html#evaluation-order

相关问题 更多 >