列表列表更改意外地反映在子列表中

2023-11-23

我创建了一个列表列表:

>>> xs = [[1] * 4] * 3
>>> print(xs)
[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]

然后,我更改了最里面的值之一:

>>> xs[0][0] = 5
>>> print(xs)
[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]

为什么每个子列表的每个第一个元素都更改为5?


也可以看看:

  • 如何克隆列表以使其在分配后不会意外更改?解决问题的方法

  • 字典列表仅存储每次迭代中最后附加的值对于字典列表的类似问题

  • 如何在 Python 中初始化空列表字典?对于列表字典的类似问题


当你写的时候[x]*3本质上你得到了列表[x, x, x]。也就是说,一个列表包含 3 个对同一内容的引用x。当你修改这个单曲时x通过对它的所有三个引用都可以看到它:

x = [1] * 4
xs = [x] * 3
print(f"id(x): {id(x)}")
# id(x): 140560897920048
print(
    f"id(xs[0]): {id(xs[0])}\n"
    f"id(xs[1]): {id(xs[1])}\n"
    f"id(xs[2]): {id(xs[2])}"
)
# id(xs[0]): 140560897920048
# id(xs[1]): 140560897920048
# id(xs[2]): 140560897920048

x[0] = 42
print(f"x: {x}")
# x: [42, 1, 1, 1]
print(f"xs: {xs}")
# xs: [[42, 1, 1, 1], [42, 1, 1, 1], [42, 1, 1, 1]]

要解决此问题,您需要确保在每个位置创建一个新列表。一种方法是

[[1]*4 for _ in range(3)]

这将重新评估[1]*4每次而不是评估一次并对 1 个列表进行 3 次引用。


你可能想知道为什么*无法像列表理解那样创建独立的对象。这是因为乘法运算符*对对象进行操作,无需看到表达式。当你使用*乘以[[1] * 4] by 3, *只能看到 1 元素列表[[1] * 4]评估为,而不是[[1] * 4表达文本。*不知道如何复制该元素,不知道如何重新评估[[1] * 4],并且不知道您是否需要副本,而且一般来说,甚至可能没有办法复制该元素。

唯一的选择*has 是对现有子列表进行新引用,而不是尝试创建新子列表。其他任何事情都会不一致或需要对基本语言设计决策进行重大重新设计。

相反,列表推导式在每次迭代时重新评估元素表达式。[[1] * 4 for n in range(3)]重新评估[1] * 4每次都出于同样的原因[x**2 for x in range(3)]重新评估x**2每次。每一次评价[1] * 4生成一个新列表,因此列表理解可以完成您想要的操作。

顺便,[1] * 4也不复制以下元素[1],但这并不重要,因为整数是不可变的。你不能做类似的事情1.value = 2并将1变成2。

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

列表列表更改意外地反映在子列表中 的相关文章

  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何使用Conda下载python包并随后离线安装?

    我知道通过 pip 我可以使用以下命令下载 Python 包 但 pip install 破坏了我的内部包依赖关系 当我做 pip download
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • svg动画可以暂停而不丢失累积的信息吗?

    您可以不受限制地停止和重复动画 但如果重新启动无限期动画 它将丢失其累积值并从初始值开始 也许我应该用一个例子来澄清 以这个动画为例
  • 在 WPF 中使用 Unity 解析时 SynchronizationContext.Current 为 null

    我有一个 WPF 代码 看起来像这样 public class AlphaProductesVM BaseModel private ObservableCollection
  • 如何编辑jupyter lab主题

    As 在上一个问题中描述过 现在可以编辑 Jupyter Lab 主题 然而 这个主题对我个人来说有一些问题 例如 它使绘图轴难以阅读 因为它们的默认颜色是黑色 其他用户have had 类似问题 因此 我想分叉现有主题并将绘图显示单元设置
  • 测量 C++ OpenMP 代码中的执行时间

    我正在 i 以顺序方式运行 cpp 代码并 ii 使用 OpenMP 语句 我想看看时差 为了计算时间 我使用这个 include
  • l.append[i],对象不可下标? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 当我做 l for i in range 10 if i 3 0 or i 5 0 l append i print sum l I get Traceback most r
  • 使用 EPPLUS 下载受密码保护的 Excel

    我正在使用 Excel 形式导出数据EPPLUSExcel 库 我希望当 Excel 下载时它会要求输入密码 我尝试过以下代码 FileInfo newFile new FileInfo sample xlsx using ExcelPac
  • Node.js 和 JXcore 如何选择?

    JXcore 似乎是对 Node js 的改进 检查这个精心设计的报价 JXcore 具有内置的多线程支持 可以 在您现有的 Node js 应用程序上启用 无需额外 变化 JXcore 多线程可能比 Node JS 集群模块带来大约 30
  • 如何在Google表格中列出所有排列而不重复?

    当前帖子是此链接问题的后续问题 洗牌一副假设的 7 张交易卡 并在 Google 表格中列出它们可以出现的订单 惊喜 我的问题孩子实际上是 真女神转生 3 的排列 一款电子游戏 我认为将其放入交易卡的术语中对于外行来说会更有意义 对不起 好
  • 如何将地图转换为数据框?

    m 是一个映射 如下所示 scala gt m res119 scala collection mutable Map Any Any Map A gt 0 11164610291904906 B gt 0 1185675594342461
  • Node.js 请求 CERT_HAS_EXPIRED

    我正在使用 Mikeal 的请求 https github com mikeal request 向服务器发出 https 请求 但是 我不断收到 CERT HAS EXPIRED 授权错误 request url https www do
  • 如何使用 jq 从 JSON 获取键名称

    curl http testhost test com 8080 application app version jq version jq 上述命令仅输出如下值 email protected 2323 test 02 03 2014 1
  • HibernateException:无法获取当前线程的事务同步会话

    我收到错误 Exception in thread main org hibernate HibernateException Could not obtain transaction synchronized Session for cu
  • 如何更改每个 HTTP 请求的 NHibernate 连接字符串?

    确实如上 An ISessionFactory OpenSession 可以提供一个IDbConnection 另一种选择是实施IConnectionProvider这将创造适当的IDbConnection实例取决于某些条件 必须是全局的
  • wkhtmltopdf 输出流和下载 - 对话框

    是否可以从任何 html 文件获取 wkhtmltopdf 创建的 pdf 流 并在 IE Firefox Chrome 等中弹出下载对话框 目前我通过以下代码获取输出流 public class Printer public static
  • Rails 3 中的自引用模型

    我有一个实体模型 我想显示实体之间的连接 即实体 1 连接到实体 2 我现在的想法是在两者之间创建一个称为 Connection 的连接模型 并让它像传统的 Rails 连接表一样工作 除了列为entity one id和entity tw
  • 如何直接在 C# 中执行批处理命令?

    我想执行批处理命令并将输出保存在字符串中 但我只能执行文件而无法将内容保存在字符串中 批处理文件 回声关闭 C lmxendutil exe licstatxml 主机 serv005 端口 6200 gt C Temp HW Lic XM
  • XCODE 在构建和运行时自动保存代码?

    如何告诉 Xcode 在每次构建并运行时自动保存源代码而不提示 Xcode 首选项 选择 建筑 选项卡 右下角 对于未保存的文件 选择 始终保存
  • Google Appengine NDB 祖先与键查询

    我将一个实体的密钥存储为另一个实体的属性 以便将它们关联起来 目前项目正处于重构阶段 所以我正在考虑引入祖先 这两种方法之间有性能差异吗 如果我们介绍祖先 我可能会获得什么特定的优势 class Book ndb Model class A
  • AngularJS:ng-selected不显示所选值[重复]

    这个问题在这里已经有答案了 正如标题所示 我的选择似乎无法显示所选值 也就是说 例如 正确选择了
  • 列表列表更改意外地反映在子列表中

    我创建了一个列表列表 gt gt gt xs 1 4 3 gt gt gt print xs 1 1 1 1 1 1 1 1 1 1 1 1 然后 我更改了最里面的值之一 gt gt gt xs 0 0 5 gt gt gt print x