Python 列表在类实例初始化时应该为空,但事实并非如此。为什么? [复制]

2024-01-08

我想创建一个类的实例,其中包含默认为空的列表;我不想稍后将此列表设置为最终的完整列表,而是想连续向其中添加项目。这是一段示例代码来说明这一点:

#!/usr/bin/python

class test:
    def __init__(self, lst=[], intg=0):
        self.lista   = lst
        self.integer = intg

name_dict = {}
counter   = 0

for name in ('Anne', 'Leo', 'Suzy'):
    counter += 1

    name_dict[name] = test()
    name_dict[name].integer += 1
    name_dict[name].lista.append(counter)

    print name, name_dict[name].integer, name_dict[name].lista

当我运行上面的程序时,我期望得到

安妮 1 [1]
狮子座 1 [2]
苏西 1 [3]

正如我所假设的lista始终初始化为空列表。

我得到的是这样的:

安妮 1 [1]
狮子座 1 [1, 2]
苏西 1 [1,2,3]

如果我更换self.lista = lst by self.lista = []它工作正常,就像我添加该行时一样name_dict[name].lista = []到 for 循环。

为什么前面的对象列表的内容被保留,但它们的值integer不是吗?我对 Python 相当陌生,所以如果有人能向我指出我的想法/假设在哪里误入歧途,那就太好了。

预先非常感谢您的回复。


使用可变对象作为默认值是一个非常糟糕的主意,如下所示:

def __init__(self, lst=[], intg=0):
     # ...

改成这样:

def __init__(self, lst=None, intg=0):
     if lst is None:
         lst = []
     # ...

您的版本不起作用的原因是,在定义函数时仅创建一次空列表,而不是每次调用函数时创建空列表。

在某些 Python 实现中,您可以通过检查以下值来查看函数的默认值:func_defaults:

print test.__init__.func_defaults
name_dict[name] = test()
# ...

Output:



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

Python 列表在类实例初始化时应该为空,但事实并非如此。为什么? [复制] 的相关文章

随机推荐

  • 使用 jquery/javascript 单击切换

    我想单击一个表元素并让它在第一次单击时执行 x 操作 如果再次单击则执行 Y td class p img src person2 png td 这就是我刚才单击一下的 HTML 但我希望更改它 以便可以选择一个项目 然后如果再次单击取消选
  • Django Forms:如果选中布尔字段,则禁用字段

    这是我的表单的定义 class WorkflowForm forms Form new user forms BooleanField required False user ModelChoiceField queryset User o
  • Openlayers-3 强制刷新地图

    我有一个自定义样式 可以显示 隐藏地图上的功能 但是当应用它时 它不会激活 直到地图由于功能更新而刷新 但我需要它立即触发 我尝试了 map render 和 renderSync 但它们什么也没做 mapResize 似乎也没有执行任何操
  • System.Web 可以与具有完整框架的 ASP.Net Core 一起使用吗

    我们正在运行基于不同 Net 版本的多个站点 其中一个站点正在运行 Net 4 6 和 ASP Net MVC 5 xx 要使用 Razor 的新语法 我们希望升级此站点以使用 Net 4 6 和 ASP Net Core 我们在网站上使用
  • Flutter:多个小部件使用相同的 GlobalKey

    当我运行此代码时 我收到错误 Multiple widgets used the same GlobalKey 所以我可以解决这个问题 如何将密钥动态传递给 listview Builder 可以通过吗 这是我的代码的简化版本 Global
  • PHP:运行计划作业(cron 作业)

    我的网络酒店上有一个网站 我想在其上运行一些计划任务 您会推荐哪些方法来实现这一目标 到目前为止 我想到的是在每个页面的顶部包含一个脚本 然后让该脚本检查是否该运行该作业 这只是我正在思考的一个简单例子 if alreadyDone 0 t
  • 用清漆+正则表达式替换页面中的内容

    如果我希望我的清漆缓存服务器在提供或存储页面 vcl fetch 之前从后端替换页面内的内容 即 更改 div 上的类 该怎么做 我想使用简单的正则表达式来执行替换 因为我想象清漆本身就支持它 Varnish 本身不支持修改响应正文 为此
  • 为什么我们的查询会卡在 MySql 中的“Writing to net”状态?

    我们有很多疑问 select from tbl message 卡在 正在写入网络 状态 该表有 98k 行 问题是 我们甚至没有从我们的应用程序中执行任何类似的查询 所以我想问题是 什么可能会生成查询 以及为什么它会陷入状态 写入网络 我
  • 使用 JavaScript 禁用 iPhone 中的“Go”按钮

    我正在为 iPhone 创建一个小表单 并在该表单上进行 JavaScript 验证 当然由服务器验证支持 但这不是重点 作为此验证的结果 我动态启用 禁用提交按钮 除了屏幕键盘上的 Go 按钮不反映我拥有的唯一提交按钮的状态并且始终处于启
  • std::map 在炼金术中损坏了?

    以下代码测试以 std string 作为键的 std map 的使用 include
  • VS 2017命令行错误D8004

    我别无选择 我正在尝试在 Visual Studio 2017 Community 上使用 GoogleTest 但它给了我很多 警告 C4996 std tr1 警告 STL4002 非标准 std tr1 命名空间和仅 TR1 的机器已
  • Ruby 和 Rails Github 操作退出代码 16

    我正在尝试为新的 Rails 项目设置一个带有 Github 操作的持续集成工作流程 这是错误 2022 05 21T17 07 01 1242737Z Your bundle only supports platforms x86 64
  • 使用SIMD右移32位压缩负数

    我正在编写一些 SSE AVX 代码 并且有一个任务将打包的有符号 32 位整数除以 2 的补码 当值为正时 这种移位工作正常 但由于移位符号位 它会产生负值的错误结果 是否有任何 SIMD 操作可以让我进行移位并保留符号位的位置 谢谢 S
  • Android:SlidingDrawer在SurfaceView下消失

    我正在尝试在 FrameLayout 上创建一个包含 LinearLayout 内容的 SlidingDrawer 起初一切似乎都很好 我在屏幕底部找到了 SlidingDrawer 的句柄 但是 如果我开始向上拖动手柄并且内容开始显示 它
  • MacOS 虚拟输入设备

    如何在代码中创建虚拟 HID 设备 我试图避免编写内核扩展来完成此任务 但这似乎是唯一的方法 我需要能够创建所有类型的虚拟 HID 设备 并让一个应用程序在后台运行以向其提供事件 有没有办法在用户空间中做到这一点 或者我必须冒险进入内核空间
  • T-SQL、XQuery 无效列

    我正在学习 XQUERY 并试图完成我认为非常简单的事情 这是我的 T SQL 代码 DECLARE XML xml set xml
  • VueJS 在渲染数据之前等待 Apollo

    另一篇文章中的简单示例 new Vue el app data filters id issuedBy issuedTo items id 1234 issuedBy Operator issuedTo abcd efgh id 5678
  • 将 CSV 文件中的数据存储到数据库中

    我有一个旅馆的 Django 模型 其中包含 FileUpload 字段之一 我将从该字段获取 CSV 文件并填充数据库 过去两天我一直在尝试搜索如何做到这一点 但无法正常工作 这如何将csv数据导入django模型 https stack
  • Twitter Bootstrap 3 - 如何用定制图标正确替换 glypiccons?

    这是我的 HTML ul class nav nav pills nav stacked custom nav pills li a href span class glyphicon glyphicon home span Home a
  • Python 列表在类实例初始化时应该为空,但事实并非如此。为什么? [复制]

    这个问题在这里已经有答案了 我想创建一个类的实例 其中包含默认为空的列表 我不想稍后将此列表设置为最终的完整列表 而是想连续向其中添加项目 这是一段示例代码来说明这一点 usr bin python class test def init