再次使用该值作为索引以避免局部变量时列表交换两个元素失败

2024-03-16

l1=[0,2,1]
index=1
from ipdb import set_trace; set_trace()
l1[index], l1[l1[index]] = l1[l1[index]], l1[index]
print(l1)

为什么会l1是相同的?l1[1] and l1[2]不会交换。


您可以更改顺序,它会起作用:

l1=[0,2,1]
index=1
l1[l1[index]], l1[index] = l1[index], l1[l1[index]]
print(l1)

Output:

[0, 1, 2]

因此,让我们首先看看代码的反汇编:

import dis
def switch():
    l1=[0,2,1]
    index=1
    l1[index], l1[l1[index]] = l1[l1[index]], l1[index]
    return l1
dis.dis(switch)
  2           0 LOAD_CONST               1 (0)
              2 LOAD_CONST               2 (2)
              4 LOAD_CONST               3 (1)
              6 BUILD_LIST               3
              8 STORE_FAST               0 (l1)

  3          10 LOAD_CONST               3 (1)
             12 STORE_FAST               1 (index)

  5          14 LOAD_FAST                0 (l1)
             16 LOAD_FAST                0 (l1)
             18 LOAD_FAST                1 (index)
             20 BINARY_SUBSCR
             22 BINARY_SUBSCR
             24 LOAD_FAST                0 (l1)
             26 LOAD_FAST                1 (index)
             28 BINARY_SUBSCR
             30 ROT_TWO
             32 LOAD_FAST                0 (l1)
             34 LOAD_FAST                1 (index)
             36 STORE_SUBSCR
             38 LOAD_FAST                0 (l1)
             40 LOAD_FAST                0 (l1)
             42 LOAD_FAST                1 (index)
             44 BINARY_SUBSCR
             46 STORE_SUBSCR

  6          48 LOAD_FAST                0 (l1)
             50 RETURN_VALUE

在这种类型的赋值中,首先计算表达式的右侧(请参阅评估顺序 https://docs.python.org/3/reference/expressions.html#evaluation-order)。首先,指令集(14 - 18) loads l1[index], i.e. 1,并将其压入堆栈。然后,24-26 loads l1[l1[index]], i.e. 2并将其推入堆栈。所以堆栈现在保存[2,1]. ROT_TWO(30) https://docs.python.org/2/library/dis.html#opcode-ROT_TWO交换堆栈并使其[1, 2],我们想要的顺序。

现在,在 32 - 36 中,堆栈的顶部,即1被分配给l1[index],所以现在,l1[index] == 1, i.e. l1[1] = 1.

然后 38 - 42,栈中剩余的元素,即2被弹出到l1[l1[index]],但现在的值l1[index]是 1,所以你本质上是在做,l1[1] = 1。那么让我们看看:

l1[index], l1[l1[index]] = l1[l1[index]], l1[index]

loaded == 2, 1
after stack swapping == 1, 2

l1[1] == 1
l1[1] == 2
 # So you have modified only index 1, and then overwritten it with its original value.

像这样的事情:

             14 LOAD_FAST                0 (l1)           ¯¯|
             16 LOAD_FAST                0 (l1)   ¯¯|  2    | 1 ---------->
             18 LOAD_FAST                1 (index)__|     __|              ↓
             20 BINARY_SUBSCR                                              |
             22 BINARY_SUBSCR                                              |
             24 LOAD_FAST                0 (l1)   ¯¯|  2 ------------------------>
             26 LOAD_FAST                1 (index)__|                      |       ↓
             28 BINARY_SUBSCR                                              |       |
             30 ROT_TWO                                                    |       |
             32 LOAD_FAST                0 (l1)   ¯¯|                      ↓       |
             34 LOAD_FAST                1 (index)__|  l1[1] = 1  <--------        |
             36 STORE_SUBSCR                                   |                   |
             38 LOAD_FAST                0 (l1)                |  ¯¯|              |
             40 LOAD_FAST                0 (l1)   ¯¯|          ↓    |              |
             42 LOAD_FAST                1 (index)__| l1[1] == 1  __| l1[1] = 2 <---
             44 BINARY_SUBSCR
             46 STORE_SUBSCR

如果我们在我的解决方案中遵循相同的推理:

l1[l1[index]], l1[index] = l1[index], l1[l1[index]]

loaded = 1, 2
after stack swapping == 2, 1

l1[2] = 2
l1[1] = 1
# Here, as you have not changed the value of `l1[index]` in the first assignment, the order remains.

现在您可以遵循相同的逻辑l1 = [0, 1, 2]。虽然不需要解释,因为两者l1[index] and l1[l1[index]]是相同的:

l1 = [0, 1, 2]

l1[index], l1[l1[index]] = l1[l1[index]], l1[index]

loaded = 1, 1
after stack swapping == 1, 1

l1[1] == 1
l1[1] == 1
------------------------------------------------------------------
l1[l1[index]], l1[index] = l1[index], l1[l1[index]]

loaded = 1, 1
after stack swapping == 1, 1

l1[1] = 1
l1[1] = 1
# Here both have same value, so it does not modify.

因此,当您通过传递列表元素作为索引来访问索引时,最好避免这种分配。相反,应该Explicit https://www.python.org/dev/peps/pep-0020/:

l1 = [0, 2, 1]
index1 = 1
index2 = l1[index1]
l1[index1], l1[index2] = l1[index2], l1[index1]
print(l1)
# [0, 1, 2]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

再次使用该值作为索引以避免局部变量时列表交换两个元素失败 的相关文章

  • Mac OS 上的诗歌安装失败,显示“should_use_symlinks”

    我正在尝试使用以下命令安装诗歌 curl sSL https install python poetry org python3 但它失败了 但有以下例外 例外 此版本的 python 无法在不使用符号链接的情况下创建 venvs 下面是详
  • Sublime Text 插件开发中的全局 Python 包

    一 总结 我不知道 Sublime Text 插件开发人员如何使用 Sublime Text 查找全局 Python 包 而不是 Sublime Text 目录的 Python 包 Sublime Text使用自己的Python环境 而不是
  • 使用 python 中的公式函数使从 Excel 中提取的值的百分比相等

    import xlrd numpy excel Users Bob Desktop wb1 xlrd open workbook excel assignment3 xlsx sh1 wb1 sheet by index 0 colA co
  • Pandas:GroupBy 到 DataFrame

    参考这个关于 groupby 到 dataframe 的非常流行的问题 https stackoverflow com questions 10373660 converting a pandas groupby object to dat
  • Kivy - 有所有颜色名称的列表吗?

    在 Kivy 中 小部件 color属性允许输入其值作为字符串颜色名称 也 例如在 kv file Label color red 是否有所有可能的颜色名称的列表 就在这里 来自Kivy 的文档 https kivy org doc sta
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • 在没有模型的情况下将自定义页面添加到 django admin

    我正在尝试在没有模型关联的情况下向管理员添加自定义页面 这就是我迄今为止所取得的成就 class MyCustomAdmin AdminSite def get urls self from django conf urls import
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • Python新式类和__subclasses__函数

    有人可以向我解释为什么这有效 在 Python 2 5 中 class Foo object pass class Bar Foo pass print Foo subclasses 但这不是 class Foo pass class Ba
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • SMTP_SSL SSLError: [SSL: UNKNOWN_PROTOCOL] 未知协议 (_ssl.c:590)

    此问题与 smtplib 的 SMTP SSL 连接有关 当与 SMTP 无 ssl 连接时 它正在工作 在 SMTP SSL 中尝试相同的主机和端口时 出现错误 该错误仅基于主机 gmail 设置也工作正常 请检查下面的示例 如果 Out
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 当数据库不是 Django 模型时,是否可以使用数据库中的表?

    是否可以从应用程序数据库中的表获取查询集 该表不是应用程序中的模型 如果我有一个不是名为 cartable 的模型的表 从概念上讲 我想这样做 myqueryset cartable objects all 有没有相对简单的方法来做到这一点
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud
  • Apache Beam Pipeline 写表后查询表

    我有一个 Apache Beam Dataflow 管道 它将结果写入 BigQuery 表 然后我想查询该表以获取管道的单独部分 但是 我似乎无法弄清楚如何正确设置此管道依赖性 我编写的新表 然后想要查询 与一个单独的表连接以进行某些过滤

随机推荐

  • 恢复发送至自部署合约的BNB

    我正在尝试创建 BOT 因此在 BSC 中从 eatamask 创建并部署了一个合约 我向该合约发送了一些 BNB 来检查 但没有成功 我怎样才能拿回BNB 感谢帮助 因为我对此很陌生 除非您在合约中具有允许您提取资金的自定义功能 否则它们
  • 如果 URL 是 https,Python urllib2 会给出“网络无法访问错误”

    我正在尝试使用 urllib2 库获取一些网址 a urllib2 urlopen http www google com ret a read 上面的代码工作正常 并给出了预期的结果 但是当我创建 url https 时 它会给出 网络无
  • 将文本插入活动迷你缓冲区

    我试图在运行外部命令后将文本插入到迷你缓冲区中 例如 call interactively eval expression insert blah 当然 问题是 eval expression 在用户输入之前不会返回 我的最终目标是添加一些
  • Xcode 6:项目导航器中没有 Frameworks 文件夹

    我正在使用 Xcode 6 并遵循 Xcode 版本 4 教程 因此这里和那里的情况有所不同 我的项目导航器中似乎没有 Frameworks 文件夹 因此当我下载一些 framework 文件并在项目编辑器的构建阶段手动添加它们时 我没有
  • HttpUtility.UrlEncoded URL 段的错误请求 400

    因此 如果我的应用程序 MVC url 中存在 url 编码段 则 IIS 会抛出 BAD REQUEST 400 e g http u lasoo com au Offer http u lasoo com au Offer 9289 7
  • json 从遗留属性名称反序列化

    如何设置 Newtonsoft Json 使用旧成员名称反序列化对象 但使用当前成员名称序列化它 编辑 要求是从正在序列化 反序列化的类中删除过时的成员 这是一个需要序列化和反序列化的示例对象 我给了一个属性一个属性 其中包含它过去可能已序
  • 将字典转换为方阵

    我想学习如何将字典转换为方阵 根据我所读到的内容 我可能需要将其转换为 numpy 数组 然后重新调整它的形状 我不想使用 reshape 因为我希望能够根据用户输入的信息来执行此操作 换句话说 我希望代码能够给出一个方阵 无论用户输入了多
  • 必须重新验证此请求的标头错误吗?

    我注意到 Chrome 缓存了一个视频文件 我用服务器上的另一个替换了它 chrome 继续从缓存中提供旧的 使用 JW flash 播放器 5 请求的标头如下所示 joe joe desktop wget O S spider http
  • 为什么这个 MySQL 查询的结果会相互相乘?

    SELECT user id SUM COALESCE point points 0 AS total points SUM CASE WHEN point date gt this month THEN point points ELSE
  • 在 Flutter 中以编程方式扩展 ExpansionTile

    我只是想用ExpansionTile在 Flutter 中 我将示例修改为如下所示 我想隐藏箭头并使用Switch扩大瓷砖 可以吗 或者我是否需要以编程方式呈现子项的自定义小部件 基本上 我只需要显示 隐藏孩子们 这是我的代码 import
  • 如何在 bash 脚本中重新组织 sed 正则表达式中的嵌套引号,从而触发“未终止的替代模式”错误?

    以下命令抛出一个unterminated substitute patternbash 中的错误 eval echo sed s a u a z n n 1 但并不适合所有人 Linux 显然运行良好 Mac 抛出未终止的替代模式错误 我该
  • 骨干获取回调的正确方法

    我的 Backbone 应用程序有一个名为schedule 我对成功和错误调用正确函数的区别有点困惑 我尝试了下面列出的两种可能的方法 但我不知道有什么区别以及从放置的路由器调用函数的正确方法是什么在外部视图中 第一种方式 require
  • 使用OpenGL和GLFW的简单三角形[重复]

    这个问题在这里已经有答案了 我编写了一个小程序来使用顶点缓冲区显示一个简单的三角形 对于我使用 glfw 的窗口 我的环境是 Mac 10 9 XCode 5 窗口看起来是黑色的 但三角形不是油漆 这里是代码 include
  • 除应用内支付之外的 iOS 支付网关

    我有一个iPhone应用程序 其中有在线支付功能 对于付款 我想使用我自己的网站上的支付网关 这样我就可以将用户重定向到网站进行付款 谁能帮我 苹果会允许这个功能吗 任何帮助或建议将不胜感激 提前致谢 苹果允许第三方支付网关系统 Strip
  • java.lang.NoClassDefFoundError:无法初始化类 hudson.util.ProcessTree$UnixReflection

    我在尝试使用 Jenkins 构建项目时遇到了这个问题 java lang NoClassDefFoundError 无法初始化类 hudson util ProcessTree UnixReflection java lang NoCla
  • 使用 multer 和 gridfs 快速上传文件(文件损坏?)

    我正在尝试上传文件 图像 上传正常 文件存储在 Mongo 中 并且与原始文件具有相同的内容类型和大小 然后当我尝试下载它时 文件已损坏但保持相同的内容类型 如果我上传pdf 它会被识别为pdf 如果它是png 它也会被识别 但我无法打开它
  • 在 Web 服务器上部署可执行进程的最佳方法是什么?

    原问题 这个问题的标题可能措辞有点笨拙 但情况是这样的 我的服务器上部署了一个 NET Web 项目 它仍处于测试阶段 因此有很多发布和重新发布的情况发生 我还在同一个 VS 解决方案中编写了一个 C 可执行文件 称为 admin exe
  • Python 中的 DATEXII XML 文件到 DataFrame

    最近几天我一直在尝试打开并读取某个 XML 文件 DATEXII 格式 但到目前为止还没有成功 这是关于交通数据NDW 开放数据网站 http 83 247 110 3 OpenDataHistorie 荷兰道路和交通数据数据库 XML 文
  • 如何在大型对象上查找 Python Pickle 中的错误源

    我已经接管了某人的一个相当大的项目的代码 我正在尝试保存程序状态 并且有一个巨大的对象存储了几乎所有其他对象 我正在尝试腌制这个对象 但出现以下错误 pickle PicklingError 无法pickle 找不到它builtin mod
  • 再次使用该值作为索引以避免局部变量时列表交换两个元素失败

    l1 0 2 1 index 1 from ipdb import set trace set trace l1 index l1 l1 index l1 l1 index l1 index print l1 为什么会l1是相同的 l1 1