当前位置: 首页 > 知识库问答 >
问题:

在Python列表中交换项时的奇怪结果

黄朗
2023-03-14
i = 1
nums = [-1, 4, 3, 1]
nums[i]
nums[nums[i]-1] = nums[nums[i]-1]
nums[i]
nums[nums[i]-1]
nums[i] = nums[i]
nums[nums[i]-1]

这些数字是[-1,1,3,4],这正是我所期望的。

我完全搞不懂这两个案子的情况。有人能解释清楚吗?

共有1个答案

丁成弘
2023-03-14

在Python中,您试图做的事情称为多重赋值。考虑以下代码:

[print(0)][0], [print(1)][0] = print(2), print(3)

产出:

2
3
0
1
[print(0)][0] = [print(1)][0] = [print(2)][0] = [print(3)][0]

产出:

3
0
1
2
i = 1
nums = [-1, 4, 3, 1]
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]

nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = 4, nums[nums[i]-1]

nums: [-1, 4, 3, 1]
nums[nums[i]-1], nums[i] = 4, 1

nums: [-1, 4, 3, 1]
nums[3], nums[i] = 4, 1

nums: [-1, 4, 3, 4]
nums[i] = 1

nums: [-1, 1, 3, 4]
 类似资料:
  • 问题内容: 我有这段代码: 但我得到的结果是: 当然,我期望低于20的数字不会出现在结果中,我假设我对删除操作做错了什么。 问题答案: 在遍历列表时,你正在修改它。这意味着第一次遍历循环时,i==1,因此1从列表中删除。然后for循环转到列表中的第二项,不是2,而是3!然后从列表中删除,然后for循环转到列表中的第三项,现在是5。等等。也许这样更容易想象,用表示的值: 最初是列表的状态;然后删除1

  • 问题内容: 我不了解python中列表的行为: 为什么一个元素的分配影响另一个元素?感谢您的回答! 问题答案: 当您将一个列表相乘时,它会复制对该列表的引用,但不会创建该列表的副本。由于列表是可变的,因此在更改列表时,所有对其引用的引用都会更改。 用ASCII术语来说: 您可以清楚地看到更改list3将同时影响两个位置。 如果要创建可变长列表而不复制引用,则应执行以下操作: 在这里,我们使用列表理

  • 问题内容: 我在这样的列表中有一个元组/列表: python(在非常低的cpu / ram机器上运行)交换值的最快方法是什么… 当前使用: 有更好或更快速的方法吗??? 问题答案: 您可以使用地图: 或列表理解: 列表理解是首选方法,并且在需要lambda时,它比map快得多。但是请注意,列表理解具有严格的评估标准,也就是说,如果担心内存消耗,它将在绑定到变量后立即对其进行评估。 生成器 :

  • 问题内容: 我正在回答这个问题,在这里我更喜欢生成器表达式并使用了它,我认为这样做会更快,因为生成器不需要先创建整个列表: Levon在解决方案中使用了列表理解功能, 但是当我做这些LC的时间结果比生成器快时: 然后我增加了列表的大小,并再次计时: 这次搜索生成器的时间比LC快,但是当我搜索中间元素(11)和最后一个元素时,LC再次击败了生成器表达式,我不明白为什么? 问题答案: 扩展Paulo的

  • 我正在研究一个名为“回文链表”的LeetCode问题,其中给出了一个单链表,确定它是否是回文。例如,如果输入为1- 我通过使用额外的空间(将列表转换为ArrayList)来解决这个问题,现在我尝试用另一种方法来解决它,反转列表的第二部分,然后比较这两部分。虽然我可能没有以最好的方式实现这个想法,但我希望代码要么工作,要么输出错误的答案(然后我可以改进代码)。然而,一个奇怪的NullPointerE

  • 当试图从Hitbox API获取数据时,我得到了一个奇怪的结果。对于一个API的命令,这种情况每次都会发生,而对于另一个API的命令,这种情况只是有时发生。结果差不多是这样(这是我得到的最后一个结果): \U001F\B\0\0\0\0\0\U0003W8SμMU~S N T&N G6C$Z%9IGF[(\U0005\U000F(:6\U000F\B P C\U0015\N\U007F V\U00