当前位置: 首页 > 面试题库 >

元组拆包顺序更改分配的值

归俊捷
2023-03-14
问题内容

我认为两者是相同的。

nums = [1, 2, 0]    
nums[nums[0]], nums[0] = nums[0], nums[nums[0]]    
print nums  # [2, 1, 0]

nums = [1, 2, 0]    
nums[0], nums[nums[0]] = nums[nums[0]], nums[0]    
print nums  # [2, 2, 1]

但是结果是不同的。
为什么结果不同?(为什么第二个结果呢?)


问题答案:

先决条件 -2个重点

  • 列表是可变的

列表的主要部分是列表是可变的。这意味着可以更改列表的值。这就是您遇到麻烦的原因之一。请参阅文档以获取更多信息

  • 评估顺序

另一部分是,在拆开元组的包装时,评估从左到右开始。请参阅文档以获取更多信息

介绍

当您执行和a,b = c,d的值时cd将首先存储它们。然后从左侧开始,将的值a首先更改为c,然后将的值b更改为d

这里的要点是,如果b更改的值时的位置有任何副作用a,则将d其分配给 后者 b,这b受的副作用影响a

用例

现在来解决你的问题

在第一种情况下,

nums = [1, 2, 0]    
nums[nums[0]], nums[0] = nums[0], nums[nums[0]]

nums[0]最初是1nums[nums[0]]2因为它的计算结果nums[1]。因此,现在将1,2存储到内存中。

现在,元组拆包是从左侧开始的,所以

nums[nums[0]] = nums[1] = 1   # NO side Effect. 
nums[0] = 2

因此print nums将打印[2, 1, 0]

但是在这种情况下

nums = [1, 2, 0]   
nums[0], nums[nums[0]] = nums[nums[0]], nums[0]

nums[nums[0]], nums[0] 与第一种情况一样,将2,1放在堆栈上。

但是,在左侧,即 nums[0], nums[nums[0]]的更改nums[0]有副作用,因为它用作中的索引nums[nums[0]]。从而

nums[0] = 2
nums[nums[0]] = nums[2] = 1  # NOTE THAT nums[0] HAS CHANGED

nums[1]价值保持不变2。因此print nums将打印[2, 2, 1]



 类似资料:
  • 问题内容: 我正在创建一个RESTful Web服务(在Golang中),该服务从数据库中提取一组行并将其返回给客户端(智能手机应用程序或Web应用程序)。该服务需要能够提供分页。唯一的问题是,此数据在定期更改的“计算”列上排序(例如,网站上某内容的“竖起大拇指”或“竖起大拇指”的数量),因此 行可以在在客户的要求之间 。 我看了一些PostgreSQL功能,可以潜在地用来帮助我解决这个问题,但是

  • 问题内容: 我需要能够增加和减少对象中数组元素的位置。 我在MongoDB API中 查看了该API,但找不到任何让我这样做的东西。 我正在尝试使用贯通,并且我知道要向上或向下移动的元素的索引。 编码图像数组项的示例: 我想向上或向下移动“ img2”(但由于无处可去,因此“图像”应该不能向上推)。 如果我想向上推“ img2”,那么结果将是: 通过更改索引,交换或上推/下推来实现此目标都没有关系

  • 我在这个问题上发现了一些类似的问题,但我想再问一遍,以便得到一个更明确的答案。我正在编写一个图匹配算法,其中图上的每个节点分配给一个优先级集,取决于其邻居的匹配。细节其实并不重要,但我使用了std::priority_queue以便首先匹配最高优先级的节点。这里有一个棘手的问题:每次引入一个新的匹配,匹配节点的邻居的优先级将被更新。 我的问题自然是,如何更新新匹配的顺序?我能强制执行吗?或者是否有

  • -路径:/APP2/** 这意味着与其使用身份验证->路由映射->过滤web处理程序,不如使用路由映射->身份验证->过滤web处理程序。这三个组件并不是不相似,它们中的一个是过滤器,另一个是映射器,最后一个是web处理程序。现在我知道如何自定义它们,但问题是我不知道如何拦截Netty服务器构建过程,以便更改这些操作的顺序。我需要等待构建过程结束,并在开始之前更改服务器的内容。我怎么能那么做?

  • 问题内容: 我有以下元组,其中包含元组: 我想根据内部元组中包含的 第二个 值对该元组进行排序(即对Apple,Carrot,Banana而不是A,B,C进行排序)。 有什么想法吗? 问题答案: 是否:

  • 本节介绍稀疏矩阵的三元组 顺序表压缩存储方式。 通过《 矩阵的压缩存储》一节我们知道,稀疏矩阵的压缩存储,至少需要存储以下信息: 矩阵中各非 0 元素的值,以及所在矩阵中的行标和列标; 矩阵的总行数和总列数; 图 1 稀疏矩阵示意图 例如,图 1 是一个稀疏矩阵,若对其进行压缩存储,矩阵中各非 0 元素的存储状态如图 2 所示: 图 2 稀疏矩阵的压缩存储示意图 图 2 的数组中,存储的是三元组(