Python:当在append()函数中输入的对象发生变化时,对象列表也会发生变化

2023-12-05

我有一个类的对象列表。当我更改在追加函数中使用的对象时,列表也会更改。这是为什么?我来自 C++,所以这很奇怪。

我有以下代码:

    class state:

    def __init__(self):
            self.x=list([])
            self.possibleChests=list([])
            self.visitedChests=list([])

    def __str__(self):
            print "x ",
            print self.x
            print "possibleChests ",
            print self.possibleChests
            print "visitedChests ",
            print self.visitedChests
            return ""


    def addKey(self,key):
            self.x.append(key)

    def __eq__(self,other):
            if isinstance(other,self.__class__):
                    return self.__dict__==other.__dict__
            else:
                    return False


    current_state=state()

    current_state.addKey(4)
    current_state.possibleChests.extend([1,2,4])
    current_state.visitedChests.append(5)

    visitedStates=list([])

    visitedStates.append(current_state)

    current_state.addKey(5)


    if(current_state in visitedStates):
            print "Got ya!!"

    else:
            print "Not in list!!"

我得到输出:

    Got ya!!

我已经更改了 current_state 对象,因此它不应该出现在列表中。


Your state对象是可变的。你打电话时current_state.addKey(5) you modify current_state但所有pointers到它仍然指向它。在 python 列表中只包含pointers到物体。对于可变的列表,您也有同样的事情:

l1 = [ 1, 2]
l2 = l1
l1.append(3)
l2
=> shows [1, 2, 3]

你不能对字符串有同样的东西(例如),因为它们是不可变的。你不能修改它们,只能指向另一个字符串

s1 = "abc"
s2 = s1
s1 = "def"
s2
=> shows "abc"

当您在循环外部创建对象并在循环中修改它并将其添加到列表中时,这是一个常见的错误来源:在循环结束时,您有一个列表,其中包含 n 次具有最后值的同一对象。这并不是 Python 所特有的,而是可以在 Java 中观察到,如果只存储指向可变对象的指针,甚至在 C 或 C++ 中也可以观察到。

C++ 示例(这不是好的 C++,但展示问题的最低限度)

class pair {
    public:
        int key;
        int val;
}

pair* map[5];

pair p;

for (i=0; i<5; i++) {
    p.key = i;
    p.val = 2 * i;
    map[i] = &p; // only store pointer
}

在循环结束时map包含 5 个指向相同内容的指针pair with key=4 and val=8

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

Python:当在append()函数中输入的对象发生变化时,对象列表也会发生变化 的相关文章

随机推荐

  • 如何将 DWORD RGBA 转换为整数?

    我必须将 DWORD 无符号长整型 RGBA 转换为四个 int 变量 R G B 和 A 到目前为止 我有这个函数将 4 个整数转换为 DWORD unsigned long RGBA2DWORD int iR int iG int iB
  • 启动时停止背景音频

    我可以通过在 info plist 文件中添加设置来使应用程序在移动到后台时播放音频 但是 当其他一些iOS应用程序播放背景音频时 当当前应用程序进入前台时 如何停止其他应用程序调用的背景音频呢 查看 Apple 的 AVAudioSess
  • MongoCommandException:命令失败,错误 8000 (AtlasError):“未发送 SNI 名称,请确保使用 MongoDB 3.4+ 驱动程序/shell。”

    我正在使用 Java 11 Maven 项目 作为 mongodb 免费层集群 版本 4 0 13 我正在尝试通过连接字符串 对于 3 6 驱动程序或更高版本 进行连接 例如 mongodb srv user email protected
  • 覆盖 Swift 中存储的属性

    我注意到编译器不允许我用另一个存储值覆盖存储的属性 这看起来很奇怪 class Jedi var lightSaberColor Blue class Sith Jedi override var lightSaberColor Red C
  • 汇编 Linux 系统调用与汇编 OS X 系统调用

    我在 Mac 上运行汇编代码时遇到问题 我目前正在阅读 Jeff Duntemann 的书 Assembly Step by Step 问题是它专注于为 32 位 Linux 系统编写汇编 我使用的是 64 位 mac os x 系统 我仍
  • 有条件参考

    我正在编写一个应用程序 它通过Component Object Model图书馆 我必须在 Visual Studio 项目本身中引用此 COM 库 以便我编写的应用程序能够正常工作 还有一个 NET 包装器库 我必须在 Visual St
  • ios13 深色模式更改无法被 tableview Cell 识别?

    我正在检查我现有的应用程序是否可以与 ios 13 新引入的黑暗模式功能正常工作 一切似乎都工作正常 只有我的一个表视图中的单元格背景没有根据模式 暗 亮 刷新 如果应用程序以深色模式启动 单元格也会显示正确的深色背景 如果应用程序处于后台
  • 我可以使用 unix utils 以编程方式将 ANSI 控制代码“烧入”文件吗?

    示例 我开始录音script 并尝试输入echo test但省略了 o 所以我退格来纠正它 When I cat typescript一切看起来都很正常 因为代码被解释了 但如果我使用less or vim I see ech test H
  • 使用 Java 的 Path2D 创建钢笔工具时出现的问题

    我一直在尝试使用 Path2D 类与鼠标侦听器一起为我的 Java 绘图程序创建一个钢笔工具 但结果令人困惑 该工具将工作几秒钟 但随后整个应用程序将冻结并必须关闭 这里没有发生异常 程序只是冻结 这是演示该问题的 SSCCE import
  • 如何使用 Jquery 阻止浏览器调用基本身份验证弹出窗口并处理 401 错误?

    我需要使用基本身份验证发送授权请求 我已经使用 jquery 成功实现了这一点 但是 当我收到 401 错误时 基本身份验证浏览器弹出窗口将打开 并且不会调用 jquery ajax 错误回调 我最近也面临这个问题 由于您无法更改浏览器在出
  • 将准备好的语句占位符括在单引号中

    在中创建准备好的语句时mysqli 我应该将字符串值占位符括在单引号中吗 IE 我应该写 INSERT INTO Person Name VALUES or INSERT INTO Person Name VALUES INSERT INT
  • Webdrivers::网络错误 - Mac64 M1 - ChromeDriver

    我的 Capybara Selenium Webdriver 设置在尝试连接 ChromeDriver 时失败 看来他们发布了一个没有 M1 版本的版本 可以在 Chromedriver API 中找到https chromedriver
  • IF 语句始终为真

    我有一个 radwindow 用来向应用程序中的用户显示错误消息 我的目标如下 如果该消息不是警告 错误 我希望用户在弹出的 radwindow 上单击 确定 时重定向 为了实现此目的 当操作成功时 我将 HiddenField 值设置为
  • 使用 mongoose populate 过滤数据

    我有两个数据结构 数据库 和 组件 const DatabaseSchema mongoose Schema components type Schema Types ObjectId ref Components required fal
  • 从非对称数据框中获取方阵

    我是 R 的初学者 我有一系列有关已婚人士姓氏的数据 Id mar Wife Husband 1 1 Smith Johnson 2 2 Smith Carter 3 3 White Carter 4 4 Wang Smith 5 5 Wh
  • java 带有流布局的滚动窗格

    由于某种原因 我无法正常工作 确实应该很简单 我有一个带有BorderLayout 其中包含一个JPanel 南 和 中心 JPanel itemPanel itemPanel 应该包裹在滚动窗格中 它的宽度 x 并且它的所有子项都共享它的
  • 组件渲染后如何从指令调用函数?

    组件渲染后如何从指令调用函数 我有组件 export class Component ngAfterContentInit How can i call functionFromDirective 我想调用这个函数 export class
  • 使用PHP更改服务器的IP地址

    我需要能够使用 PHP 更改服务器的 IP 地址 我正在尝试使用ifconfig eth0 down as the www data用户以确保其能够正常工作 到目前为止 我已经解决了 var run network ifstate 文件上的
  • MySQL 中的条件排序?

    我有包含 3 个字段的 任务 表 date 优先级 0 1 2 完成 0 1 我想要实现的是整个表按完成标志排序 未完成的任务应按优先级排序 而已完成的任务应按日期排序 从任务顺序中选择 按完成 asc 如果done 0则另外按优先级des
  • Python:当在append()函数中输入的对象发生变化时,对象列表也会发生变化

    我有一个类的对象列表 当我更改在追加函数中使用的对象时 列表也会更改 这是为什么 我来自 C 所以这很奇怪 我有以下代码 class state def init self self x list self possibleChests l