python:无意中修改传递给函数的参数

2023-12-25

有几次我不小心修改了函数的输入。由于 Python 没有恒定的引用,我想知道什么编码技术可以帮助我避免经常犯这种错误?

Example:

class Table:
  def __init__(self, fields, raw_data):
    # fields is a dictionary with field names as keys, and their types as value 
    # sometimes, we want to delete some of the elements 
    for field_name, data_type in fields.items():
      if some_condition(field_name, raw_data):
        del fields[field_name]
    # ...


# in another module

# fields is already initialized here to some dictionary
table1 = Table(fields, raw_data1) # fields is corrupted by Table's __init__
table2 = Table(fields, raw_data2)

当然,修复方法是在更改参数之前复制该参数:

  def __init__(self, fields, raw_data):
    fields = copy.copy(fields)
    # but copy.copy is safer and more generally applicable than .copy 
    # ...

但它很容易忘记。

我半信半疑地在每个函数的开头复制每个参数,除非该参数可能引用一个大型数据集,而该数据集的复制成本可能很高,或者除非该参数打算被修改。这几乎可以消除问题,但会导致每个函数的开头出现大量无用的代码。此外,它本质上会覆盖 Python 通过引用传递参数的方法,这可能是有原因的。


第一条一般规则: 不要修改容器:创建新容器。

因此,不要修改传入的字典,而是使用键的子集创建新字典。

self.fields = dict( key, value for key, value in fields.items()
                     if accept_key(key, data) )

此类方法通常比无论如何都检查并删除坏元素更有效。更一般地说,避免修改对象并创建新对象通常更容易。

第二条一般规则: 假冒容器后请勿对其进行修改。

您通常不能假设已向其传递数据的容器已制作了自己的副本。因此,不要尝试修改您提供给他们的容器。任何修改都应在移交数据之前完成。一旦您将容器交给其他人,您就不再是它的唯一主人。

第三条一般规则: 不要修改不是您创建的容器。

如果您收到某种容器,您不知道还有谁可能在使用该容器。所以不要修改它。使用未修改的版本或调用rule1,创建一个包含所需更改的新容器。

第四条一般规则:(从伊森·弗曼那里盗来的)

一些功能是应该修改列表。那是他们的工作。如果是这种情况在函数名称中明确这一点(例如列表方法追加和扩展)。

把它们放在一起:

仅当一段代码是唯一有权访问该容器的代码时,才应修改该容器。

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

python:无意中修改传递给函数的参数 的相关文章

  • 解析lxml.etree._Element内容

    我从以下元素中解析出 table td align center valign top a href ConfigGroups aspx cfgID 451161 amp prjID 11778 amp grpID DTST target
  • 如何计算 numpy 数组中元素的特定范围

    我有一个像这样的数组 import numpy as np data np array 0 0 0 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
  • 对 numpy 数组的每 n 个元素求平均值

    我有一个 numpy 数组 我想创建一个新数组 它是每个连续三元组元素的平均值 因此 新数组的大小将是原始数组的三分之一 举个例子 np array 1 2 3 1 2 3 1 2 3 应该返回数组 np array 2 2 2 谁能建议一
  • 字符串中数字的连续相加

    我是一名正在学习 python 的新程序员 并且在如何完成此任务方面遇到了困难 所以本质上我有一个从文件导入的数字字符串需要读取 并且需要将第一个数字的总和添加到第二个数字并将其转换为正确的 ascii 字符 因此 例如 如果我正在读取字符
  • python解释器自动重启而不返回答案

    调用递归函数时 python解释器会自动重新启动吗 我正在编写一个快速排序算法 并尝试对一个大的数字数组 顺序 10 4 进行排序 但是当我尝试对整个数组进行排序时 python 正在重新启动 即给我 重新启动 并且存储在内存中的所有值 函
  • 在 Eclipse 中删除空块之前的新行

    我更喜欢奥尔曼式 http en wikipedia org wiki Brace style Allman style大括号 例如 if foo magical prancing unicorn stuff 而不是 if foo unma
  • 代码终止后保持 matplotlib / pyplot 窗口打开

    我希望 python 绘制一个图 在不阻塞控制流的情况下显示它 并在代码退出后使图保持打开状态 这可能吗 这个以及相关的主题存在于许多其他线程中 见下文 但我无法让情节保持开放且非阻塞 例如 如果我使用pyplot ion before p
  • 组内条件计数

    我想在之后进行条件计数groupby 例如 按列的值分组A 然后计算每组中值出现的频率5出现在列中B 如果我整个过程都这样做DataFrame 只是len df df B 5 所以我希望我能做到df groupby A df B 5 siz
  • 通过 beautiful soup python 找到所有字体大小大于最常见字体的跨度样式

    我了解如何从特定的位置获取文本div or span这个问题的风格 如何找到最常见的跨度样式 https stackoverflow com questions 40762692 is there a way to find the mos
  • [matplotlib]:理解“set_ydata”方法

    我试图了解如何使用 set ydata 方法 我在 matplotlib 网页上找到了很多示例 但我只找到了 set ydata 被 淹没 在大型且难以理解的代码中的代码 我想要一个简短且易于理解的代码来帮助我理解 set ydata 的工
  • 张量流 - 向量中的前 k 个值到二进制向量

    假设我有一个带有值的向量 0 4 1 2 8 7 0 2 如何获得前 k 个值的二进制向量 k 3 0 1 0 0 1 1 0 0 in 张量流 TensorFlow 的tf math top k https www tensorflow
  • 初始化整数变量以进行比较

    我正在学习麻省理工学院的开放课件课程计算机科学和 Python 编程简介 https ocw mit edu courses electrical engineering and computer science 6 0001 introd
  • XGBoostLibraryNotFound:在候选路径中找不到 XGBoost 库,您是否安装了编译器并在根路径中运行了 build.sh?

    我在移动 XGBoost 的 python package 目录时遇到这个问题 Traceback most recent call last File setup py line 19 in LIB PATH libpath find l
  • 使用 Django 添加额外 \\ 字符的 JSON 编码

    我正在尝试创建一个函数 将包含消息和 Django 模型实例的字典转换为 JSON 然后我可以将其传回客户端 例如 我在 models py 中定义了模型 Test from django db import models class Te
  • 如何在Python Selenium中获取WebElement的类名?

    我使用 Selenium WebDriver 来抓取从网页中获取的 用 JavaScript 编写的表格 我正在迭代表行列表 每行可能属于不同的类别 我想获取此类的名称 以便我可以为每一行选择适当的操作 table body table f
  • 获取SVG绘图的边界框

    我想提取 SVG 绘图的边界框 由于 Python 已经在系统上可用并且还用于执行其他任务 因此我不想使用 JavaScript 或任何其他语言 我的理解是是否可以计算单个元素的边界框 但我不知道如何计算 整个绘图的边界框只是所有元素的最小
  • 如果出现重复,则主键取正值

    我有一个数据框df Key1 Key2 Value K11 K21 V1 K11 K21 V1 K13 K23 V2 K13 K23 V2 现在 例如对于相同的键 K11 K21 组合 我们有 2 个值 一负一正 如何从此 df 中仅获取正
  • 从值数组中计算 sympy 表达式

    我正在尝试 sympy 但遇到了一个无法解决的问题 使用 scipy 我可以编写一个表达式并计算 x 值数组 如下所示 import scipy xvals scipy arange 100 100 0 1 f lambda x x 2 f
  • 对象对于所需数组来说太深 - scipy.integrate.odeint

    我昨天刚开始使用Python 使用时遇到错误scipy integrate odeint 我定义了一个函数 def SIR x t beta gamma mu M 这需要numpy array物体x t and M 标量浮动beta gam
  • gis计算点和多边形/边界之间的距离

    我想使用 python 计算一个点到一个国家边界之间的距离shapely 它应该工作得很好 point distance poly 例如在这里展示查找多边形形状上最近点的坐标 https stackoverflow com question

随机推荐

  • 禁用地图滚动打开街道地图

    如何在打开的地图中禁用鼠标交互或滚动iframe 我有以下内容并放置了属性scrollwheel false 有没有一种方法可以通过 css 禁用滚动或通过 css 交互 我愿意
  • WPF MVVM ItemsControl 具有多个 ViewModel,具体取决于对象类型

    我有一个集合 其中包含全部从同一接口继承的多种类型的项目 它绑定到 ItemsControl 窗口的 DataContext 设置为保存该集合的 ViewModel 我想做的是让集合中不同类型的每个项目使用不同的 ViewModel 因此
  • 为什么 flutter pub 缓存修复会下载以前使用的每个包版本?

    命令flutter pub cache repair下载以前使用过的每个包版本 甚至是我不再使用的库 为什么 有没有办法清理所有内容并仅下载最后一个软件包版本 不幸的是 Dart 开发团队认为磁盘空间问题已成为过去 并且没有提供清除全局缓存
  • 如何将 TServerSocket 绑定到特定 IP 地址

    有谁知道有什么方法可以绑定 Delphi TServerSocket 组件以仅接受特定本地地址上的请求吗 服务器有多个IP 但要求服务器应用程序在运行时仅接受一个I P上的请求 TServerSocket不会直接公开您所要求的功能 但是可以
  • JMeter 3.2 版本 - SOAP 请求

    如何在 JMeter 3 2 版中发出测试 SOAP 请求 在旧版本中 我有 Soap XML RPC 数据采样器 而在 3 2 版本中 我没有看到此选项 请帮忙 Use HTTP请求 http jmeter apache org user
  • 如何管理非英语客户? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 管理涉及非英语客户的软件项目时 最佳实践是什么 哪些沟通问题是相关的 您会维护两种语言的文档 特别是定期更新规范 吗 此类项目的基本风险是沟通不畅 因
  • Android DatePickerDialog:设置选择的最小和最大日期

    我知道对此有很多问题 但没有一个解决方案对我有用 所以这个问题 我想限制用户选择今天之前的日期 但我无法这样做 public class DatePickerDialogFragment extends DialogFragment pri
  • 多个安装:单个 pom.xml 中的安装文件

    在回答之前请至少阅读以下内容 这是临时措施 不 我们不想设置本地存储库管理器并手动运行脚本 我们有一个遗留项目 有一些依赖项 我们有一个包含源代码和 javadoc 的本地副本 并且已被证明在生产中运行良好 但在 Central 中无法以相
  • 如何保存以 Data-URI 编码的图像?

    我正在尝试找到一种技巧来保存在 Data URI 中编码的图片 如下所示 data image png base64 iVBORw0KGgoAAAANSUhEUgAAA1MAAAE7CAYAAAA4gNuCAAAgAElEQ i fPjJw
  • IE9 支持 Windows 7 上的触摸事件吗?

    我正在尝试在基于 Windows 7 的平板电脑上使用触摸事件 即触摸移动 在画布元素上绘图 我想知道 IE9 DOM 是否支持触摸事件 如果有人也能向我指出一些示例代码 那就太好了 IE9中没有触摸事件 我想很多人在 IE9 预览阶段就向
  • 在 dplyr 中分组并计算百分比

    我在 r 中有以下数据框 Service Container Pick Day ABC 0 ABC 1 ABC 1 ABC 2 ABC NA ABC 0 ABC 1 DEF NA DEF 0 DEF 1 DEF 1 DEF 1 DEF 2
  • Renderpartial 位于共享文件夹的子文件夹中。如何让MVC找到它?

    简短但简单 我有一个 edit ascx 位于共享文件夹中 我这样称呼它 如果我把它放在子文件夹中 它找不到该文件 如何解决这个问题 至于如何排列视图 您可以根据需要将视图放入子文件夹中并创建自己的视图结构 所有视图始终可以使用 语法通过其
  • 朴素贝叶斯分类的简单解释[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我发现很难理解朴素贝叶斯的过程 我想知道是否有人可以用英语用简单的一步一步过程来解释它 我知道它需要将发生的次数作为概率进行比较 但我不知
  • 为什么 Android 的进度对话框中没有取消按钮?

    我正面临着类似的令人头疼的时刻这个人 http groups google com group android developers browse thread thread cdae98b7832b4754 567ffa7107a73f7
  • ActionView::缺少模板

    将 mysite 部署到 VPS 后 我遇到此运行时错误 请注意 在我的本地计算机中 一切正常 当我尝试访问控制器路由的任何视图时 假设 Posts Controller index 我收到这个错误 Completed 500 Intern
  • 将数据帧传递给函数时,pandas 何时进行引用传递和值传递?

    def dropdf copy df df df drop y axis 1 def dropdf inplace df df drop y axis 1 inplace True def changecell df df y 0 99 x
  • dotnet test > 有没有办法显示在控制台中运行的测试列表?

    跑步时dotnet test 有没有办法显示在控制台中运行的所有测试的列表而不是某些输出文件 在控制台中看到这样的列表是理想的 x test1 test2 test3 x test4 而不仅仅是总体测试统计数据 运行 失败 跳过 我在 ma
  • 如何执行 URL 中没有 .php 扩展名的 PHP 网页?

    抱歉 菜鸟问题 无法理解我应该搜索的内容 我正在用该页面创建一个网站product php id 777我希望它是product 777 谢谢你 在您的 Web 根目录中创建 htaccess 文件并在其中输入以下内容 Options Fo
  • UICollectionView 滚动到项目不适用于水平方向

    我有一个UICollectionView在一个UIViewController启用分页 由于某种奇怪的原因 collectionView scrollToItem工作时的方向collectionview is vertical但当方向为ho
  • python:无意中修改传递给函数的参数

    有几次我不小心修改了函数的输入 由于 Python 没有恒定的引用 我想知道什么编码技术可以帮助我避免经常犯这种错误 Example class Table def init self fields raw data fields is a