python 覆盖我的列表元素

2023-12-27

对 python 相当新,对 python 类非常新。问题有点复杂。最感谢您的耐心:

我有一个“明星”班。很简单。属性 x、v 和质量。另一个类 Galaxy 有一个属性“stars”,它只是星星对象的列表:

class Galaxy:

    numstars=0.
    stars=[]

    def __init__(self,numin,xes,vees,masses):
        self.numstars=numin
        for n in range(numin):
            self.stars.append(Star(xes[n],vees[n],masses[n]))

Galaxy还有一个名为time_stepper的属性函数。可以说 time_stepper 只是更新“stars”的所有元素,然后返回“stars”:

def time_stepper(self,dt):
    self.velstep(dt)
    self.xstep(dt)
    self.velstep(dt)
    return(self.stars)

现在,我正在尝试驱动这个东西并将“星星”的各种更新存储在名为“历史记录”的列表中:

gal=Galaxy(#stuff#)
history=[]
for n in range(100):
    history.append(gal.time_stepper(.1))

最后,我的问题:在这个循环的每次迭代中,“星星”的新元素被添加到“历史”中,但是......这里是......所有以前的历史元素都被覆盖,并赋予与最新历史元素相同的值!那么发生了什么?我遇到过一些我以前不理解的关于 python 列表的事情,但我想我终于把它搞清楚了。显然不是。感谢您的帮助。

附录: 感谢大家的帮助。没想到这么多有用的回复,尤其是这么快。我的问题是我假设这两段代码本质上是相同的。第一的:

>>> a=[]
>>> b=[1,2,3]
>>> a.append(b)
>>> b=[4,5,6]
>>> a.append(b)
>>> a
[[1, 2, 3], [4, 5, 6]]

Second:

>>> a=[]
>>> b=[1,2,3]
>>> a.append(b)
>>> b[:]=(4,5,6)
>>> b
[4, 5, 6]
>>> a.append(b)
>>> a
[[4, 5, 6], [4, 5, 6]]

哎呀!他们不是。所以在代码 1 中,我猜 b 被“重新指向”一个全新的内存位置,而 a[0] 继续指向旧的 b。在第二个中,b 处的内存被“编辑”,并且 a[0] 仍然指向该位置。追加之后,a[1] 也指向该位置。我现在有吗?

我对 python 很陌生,并且仍在弄清楚“pythonic”哲学。但对我来说,直接完成指针的重新分配,但以更复杂的方式完成“深层复制”有点背离我通常想要做的事情的方式。谁能启发我吗?再次感谢。


我认为值得注意的是,如果你有超过 1 个星系,它们将共享相同的恒星。这可能会让你相信你正在覆盖你的星星,但实际上并没有......

我猜你可能会更好__init__看起来像:

def __init__(self,numin,xes,vees,masses):
    self.stars = []
    self.numstars = numin
    for n in range(numin):
        self.stars.append(Star(xes[n],vees[n],masses[n]))

这里我已经转移了类属性 stars成为一个实例属性。现在每个实例都有自己的stars列出而不是共享一个stars与宇宙中所有其他星系一起列出。

正如其他人所指出的,你的history列表将遇到类似的问题(您有多个引用相同的列表)。但是,修复实际上取决于您所做的事情self.velstep and self.xstep。如果您修改Star对象就位,那么简单的(浅)列表副本不会对您有任何好处(例如gal.time_stepper(0.1)[:])。 (您将创建一个新列表,但它将包含不断更新的相同星星)。在这种情况下,你会想要copy.deepcopy当您追加到历史记录列表时:

history=[]
for n in range(100):
    history.append(copy.deepcopy(gal.time_stepper(.1)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 覆盖我的列表元素 的相关文章

随机推荐

  • Auth 过滤器重定向回 Laravel 中的原始 POST 请求

    看来 Redirect guest login 只适用于 GET 请求 IE 它会将经过身份验证的用户重定向到原始预期 URL GET 在存在 POST 请求的情况下 是否有办法让身份验证过滤器在用户成功登录后继续 POST 到 URL 一
  • 如何避免 Linux/X11 上的 pygame 撕裂

    我一直在玩 pygame 在 Debian Lenny 上 它似乎工作得很好 除了烦人的位图撕裂 全屏或窗口模式 我正在使用默认的 SDL X11 驱动程序 谷歌搜索表明 X11 不提供垂直同步功能 这是 SDL 的一个已知问题 即使使用使
  • 两个相似的位姿具有较大的相对欧拉角

    欧拉角表示的相似位姿有两种 s euler angle o1 0 000549608 3 1334 1 23193 s euler angle o2 0 0222646 3 10948 1 31032 但 Eigen 计算出的相对欧拉角为
  • datagridview 虚拟模式,更新 RowCount 会导致 CellValueNeeded 为所有行触发

    我正在尝试实现 datagridview 的虚拟模式 但是当我将 RowCount 设置为某个数字 以显示滚动条 时 网格希望同时拥有所有行 而不仅仅是显示的行 DataGridView grid new grid VirtualMode
  • Matlab 周末提取

    我有一个大小为 364 x 5 的矩阵 timeVectorDaily 该矩阵具有十进制天数形式的数据 例如 734870 734870 2 734870 4 734870 6 734870 8 734871 734871 2 734871
  • 同时按下按键

    我可以知道在Javascript中同时按下的键的数量吗 如果是这样 我怎样才能拥有他们的数组keyCode 您可以监听 keydown 和 keyup 事件 var keys length 0 document onkeydown func
  • 使用 Python/bokeh 在网站中嵌入绘图

    我试图在个人网站中静态嵌入散景图 但遇到了一些我不理解的行为 基本上 我使用散景生成一个绘图 如下所示 import bokeh plotting as bplt import numpy as np x np random random
  • 如何将二维数组传递到 pycuda 的内核中?

    我找到了答案here https stackoverflow com questions 13282596 how do i feed a 2 dimensional array into a kernel with pycuda 但尚不清
  • 四舍五入到最接近的 100

    如何将整数四舍五入到最接近的 100 例如 497 将四舍五入为 500 98 将四舍五入为 100 1423 将四舍五入为 1400 我会除以 100 四舍五入 然后再次相乘 int initial int rounded int Mat
  • WPF 画布 VisibilityChanged 事件

    我想设置一个事件来运行Visibility在 WPF 上更改Canvas控制 canvas1 VisibleChanged new EventHandler canvas1 VisibleChanged 我已经尝试了上面的方法 但不起作用
  • 如何从嵌套对象生成查询字符串

    我想为我的高级过滤器生成一个查询字符串 我的对象如下所示 searchValue firstName John lastName Doe postalCode 3130 city New York page 1 我正在使用请求参数 http
  • AWS SES SendBulkTemplatedEmail,示例以及如果超出配额会发生什么情况?

    我有两个关于 AWS SES SendBulkTemplatedEmail 的问题 1 有谁知道 Net 中的分步教程吗 我只见过使用 CLI 的示例 并且正在摸索 API 来尝试使其工作 2 每个SendBulkTemplatedEmai
  • 如何在 dplyr 中链接 ifelse 语句

    我试图在我的 R 函数之一中链接 ifelse 语句 基本上我想做的是 do something lt function df cond TRUE df gt ifelse cond do something do something el
  • JQuery 自动完成替代选择下拉菜单

    我在文本输入上使用 jQuery 自动完成小部件来替换选择下拉列表 当用户单击文本框时 建议下拉菜单将打开 我的解决方案在 FireFox 中运行良好 但在 Internet Explorer 8 中运行时出现一些故障 在 Internet
  • 我如何知道何时在组合框中“重新选择”某个值?

    我正在使用 ComboBox 将文本模板插入 RichEdit 控件 模板的名称位于 ComboBox 的选项列表中 除非用户再次在列表中选择相同的值 否则一切都很好 然后SelectionChanged没有开火 根据事件的名称 这是有意义
  • 使用http劫持器有什么好处

    Go http pkg 提供了一个Hijacker http golang org pkg net http Hijacker接口 谁能告诉我什么时候应该使用它 我检查了评论 在劫持调用让调用者接管连接之后 HTTP 服务器库不会对该连接执
  • java中的正则表达式及其与indexOf的性能比较

    请有人告诉我如何匹配 和句点 使用正则表达式在字符串中恰好出现一次 而且使用 indexOf 而不是正则表达式更有效 String s Hello Wor ld or s 12323 asdfasd 基本上任何字符都可以出现在之前和之后 a
  • 使用jstree打开一个节点及其所有父节点

    我正在尝试使用 jstree 并在打开页面时打开一个节点及其所有父节点 这是我用来测试的html代码 div ul li a href TEST1 a ul li a href TEST2 a li li a href TEST3 a li
  • CSS 中 SVG“defs”标签的正确行为是什么?

    当编写带有嵌入 CSS 的 SVG 代码时
  • python 覆盖我的列表元素

    对 python 相当新 对 python 类非常新 问题有点复杂 最感谢您的耐心 我有一个 明星 班 很简单 属性 x v 和质量 另一个类 Galaxy 有一个属性 stars 它只是星星对象的列表 class Galaxy numst