python:(lambda)函数的字典[重复]

2023-11-25

在将 lambda 函数存储到字典中时,我遇到了一些奇怪的行为:如果您尝试将一些默认值传递给循环中的函数,则只会使用最后一个默认值。

这里有一些最小的例子:

#!/usr/bin/env python
# coding: utf-8

def myfct(one_value, another_value):
    "do something with two int values"
    return one_value + another_value

fct_dict = {'add_{}'.format(number): (lambda x: myfct(x, number))
            for number in range(10)}

print('add_3(1): {}, id={}'.format(fct_dict['add_3'](1), id(fct_dict['add_3'])))
print('add_5(1): {}, id={}'.format(fct_dict['add_5'](1), id(fct_dict['add_5'])))
print('add_9(1): {}, id={}'.format(fct_dict['add_9'](1), id(fct_dict['add_9'])))

输出如下

add_3(1): 10, id=140421083875280
add_5(1): 10, id=140421083875520
add_9(1): 10, id=140421083876000

您会得到不同的函数(id 不相同),但每个函数都使用相同的第二个参数。

有人可以解释一下发生了什么事吗?

python2、python3、pypy...也是如此。


The fix:

def make_closure(number):
    return lambda x: myfct(x, number)

used as

{'add_{}'.format(number): make_closure(number) for number in range(10)}

出现此行为的原因是变量number(想想:这里的命名内存位置)在循环的所有迭代期间都是相同的(尽管它的实际值在每次迭代中都会发生变化)。这里的“循环”指的是字典理解,其内部是基于循环的。全部lambda循环中创建的实例将在同一“位置”上关闭,该位置保留最后分配给它的值(在循环的最后一次迭代中)。

下面的代码是not下面实际发生了什么。它只是为了阐明以下概念:

# Think of a closure variable (like number) as being an instance
# of the following class

class Cell:
    def __init__(self, init=None):
        self.value = None

# Pretend, the compiler "desugars" the dictionary comprehension into
# something like this:

hidden_result_dict = {}
hidden_cell_number = Cell()

for number in range(10):
    hidden_cell_number.value = number
    hidden_result_dictionary['add_{}'.format(number)] = create_lambda_closure(hidden_cell_number)

All lambda由创建的关闭create_lambda_closure操作共享完全相同Cell实例并会抓住value属性在运行时(即,当闭包被实际调用时)。到那个时候,value将引用最后分配给它的值。

的价值hidden_result_dict然后作为字典理解的结果得到回答。 (再次强调:这仅意味着在“概念”级别上阅读;它与 Python VM 执行的实际代码无关)。

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

python:(lambda)函数的字典[重复] 的相关文章

随机推荐

  • EPPlus,查找并设置命名范围的值

    我一直在努力尝试使用 ExcelPackage 3 0 1 库设置命名范围 在本例中为单个命名单元格 的值 它应该像这样简单 ExcelNamedRange er xlPackage Workbook Names Customer er V
  • 如何在字典中按原始顺序返回键

    我正在读取一个文件并将信息存储在一个字典中 因为它从上到下读取 与原始文件相比 我不想以错误的顺序打印 另外 一个非常小的问题 我记得在某处看到过 if 和 else 语句的简短形式 if a a a b a c 你知道具体的形式吗 Tha
  • Rails 计算日期范围(以月为单位)

    如何计算两个日期相差几个月 另外 如果它有所不同 我正在使用 Date 对象 而不是 DateTime 另外 一些舍入选项可能会很好 这样我就可以控制是否要对部分月份进行向上或向下舍入 Thanks 从一个日期或日期时间中减去另一个日期或日
  • windows %PATH% 变量 - 如何在“;”上分割再次在 CMD shell 中[重复]

    这个问题在这里已经有答案了 我刚刚检查过堆栈溢出这似乎非常有帮助 并且在 Windows XP 上运行良好 但使用 Windows 7 时 由于某些不明原因 它无法正常工作 The PATH变量看起来像这样 C Program Files
  • 单击按钮时更改选项菜单的选项

    假设我有一个选项菜单network select它有一个要连接的网络列表 import Tkinter as tk choices network one network two network three var tk StringVar
  • python-click:依赖于另一个选项的选项

    这个问题是关于click包 我想设置我的命令 以便一些optional options取决于特定选项值 并且根据其值需要 所需选项 输入 输入文件 doe 整数 代表算法名称 子选项 如果母鹿是 等于1 then option genera
  • 使用QT,如何在一定时间间隔后调用一次函数,即使可能会发生更多调用?

    尽管我认为这个问题没有那么复杂 但我很难用措辞来表达这个问题 我想做类似的事情QTimer singleshot 但我希望它仍然只调用 SLOT 一次 即使QTimer singleshot 在触发之前被多次调用 如果您只想在计时器关闭后调
  • 实施汉恩窗

    我获取传入数据块并将它们通过 fftw 传递以获取一些光谱信息 一切似乎都正常 但我认为我遇到了一些别名问题 我一直在尝试找出如何在我的数据块上实现汉恩窗口 谷歌的例子让我失望了 我应该查看任何想法或链接吗 double dataIn 20
  • 如何在android 2.2中实现拖放?

    我正在尝试开发一个 Android 应用程序 用户应该能够将图像从网格的一个单元格拖动到另一个单元格 为了实现这一点 我需要 Android 3 0 中引入的拖放 API 但我的应用程序应该在 Android 2 2 中运行 那么 有没有办
  • Puppeteer 中主函数和渲染器函数之间的通信

    有没有一种方法可以在 Puppeteer 中的主进程和渲染进程之间进行通信 类似于ipcMain and ipc渲染器功能于Electron 在此演示了一个简单的应用程序post 我发现此功能对于通过触发事件进行调试非常有用page到主要功
  • 如何在每个应用程序启动时运行一次方法?

    嘿 我想知道如何运行一个方法 refreshChannel in an onCreate仅在我的一项活动中出现一次 直到应用程序被终止或重新启动 你可以延长Application并在中运行该方法onCreate您的自定义应用程序类 每次应用
  • 将 .mat 文件从 MATLAB 转换为 OpenCV 中的 cv::Mat 矩阵

    我有一些 MATLAB 代码想要迁移到 OpenCV MATLAB 代码使用的数据存储在 mat 文件中 然后在运行时加载该文件 我将此 mat 文件转换为 csv 文件 然后使用 ifstream 将这些数据作为字符串读入 OpenCV
  • 在 Ruby 中将数组输出到 CSV

    使用 Ruby 将 CSV 文件读入数组很容易 但我找不到任何关于如何将数组写入 CSV 文件的好的文档 谁能告诉我该怎么做 如果重要的话 我正在使用 Ruby 1 9 2 到一个文件 require csv CSV open myfile
  • R 中具有多列的逻辑向量

    我有以下数据框 a b c d e TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE FALSE TR
  • 为什么这个解决方案在 Javascript 中有效,但在 Python 中无效? (动态规划)

    我正在学习有关动态编程的教程 并且正在努力在以下问题中实现记忆化 写一个函数叫canSum targetSum numbers 返回True仅当数组中的数字之和达到目标总和时 数组中的所有数字都是正整数 您可以多次使用它们来求解 Examp
  • 如何在 firebase 存储触发函数中获取公共下载链接:“onFinalize”?

    我正在编写一个 firebase 云函数 它将最近上传的文件的下载链接记录到实时数据库 exports recordImage functions storage object onFinalize object gt object 使我可
  • 修复 R/networkD3 包中 Sankey 流程图的顺序

    我想使用桑基流程图可视化美国各州的排名变化 即相对顺序的变化 我正在使用网络d3包并提出以下内容 library dplyr library networkD3 df lt data frame origins state name 1 1
  • 使用本地资源的 SVG 元素的语法

    将 SVG image element 与本地源一起使用时 例如C image png 和互联网上的来源 例如http www google de intl de ALL images logos images logo lg gif 我的
  • Docker-Compose 不会卷我的 php.ini 文件

    我正在尝试使用 docker compose 来存储我的 php ini 文件 以便我可以在本地计算机上即时进行更改 以查看它如何影响主机 不幸的是 到目前为止 我能够将 php ini 文件放入容器的唯一方法是直接在 Dockerfile
  • python:(lambda)函数的字典[重复]

    这个问题在这里已经有答案了 在将 lambda 函数存储到字典中时 我遇到了一些奇怪的行为 如果您尝试将一些默认值传递给循环中的函数 则只会使用最后一个默认值 这里有一些最小的例子 usr bin env python coding utf