为什么 Python 的 lambda 表达式中不允许赋值?

2024-02-27

这不是重复的Python 中 lambda 表达式内的赋值 https://stackoverflow.com/questions/6282042/assignment-inside-lambda-expression-in-python,即我是not询问如何欺骗 Python 在 a 中进行赋值lambda表达。

我有一些 λ 微积分背景。考虑以下代码,它 看起来 Python 很愿意在中执行副作用lambda表达式:

#!/usr/bin/python

def applyTo42(f):
    return f(42)

def double(x):
    return x * 2

class ContainsVal:
    def __init__(self, v):
        self.v = v

    def store(self, v):
        self.v = v

def main():

    print('== functional, no side effects')

    print('-- print the double of 42')
    print(applyTo42(double))

    print('-- print 1000 more than 42')
    print(applyTo42(lambda x: x + 1000))

    print('-- print c\'s value instead of 42')
    c = ContainsVal(23)
    print(applyTo42(lambda x: c.v))


    print('== not functional, side effects')

    print('-- perform IO on 42')
    applyTo42(lambda x: print(x))

    print('-- set c\'s value to 42')
    print(c.v)
    applyTo42(lambda x: c.store(x))
    print(c.v)

    #print('== illegal, but why?')
    #print(applyTo42(lambda x: c.v = 99))

if __name__ == '__main__':
    main()

但如果我取消注释这些行

    print('== illegal, but why?')
    print(applyTo42(lambda x: c.v = 99))

I'll get

SyntaxError: lambda cannot contain assignment

为什么不?这背后更深层次的原因是什么?

  • 正如代码所示,它不可能与“纯度”有关 功能感。

  • 我能想到的唯一解释是作业不 返回任何东西,甚至不返回None。但这听起来很蹩脚,而且会 易于修复(一种方法:使 lambda 表达式返回None如果 正文是一个声明)。

不是答案:

  • 因为它是这样定义的(我想知道为什么它是这样定义的)。

  • 因为它在语法中(见上文)。

  • Use def如果您需要声明(我没有询问如何获得 语句到函数中)。

如果你能举出这样一个改变的例子,以及为什么它会不好的话,“这会改变语法/语言/语义”作为答案就可以了。


The entire reason lambda exists is that it's an expression.1 If you want something that's like lambda but is a statement, that's just def.

Python expressions cannot contain statements. This is, in fact, fundamental to the language, and Python gets a lot of mileage out of that decision. It's the reason indentation for flow control works instead of being clunky as in many other attempts (like CoffeeScript). It's the reason you can read off the state changes by skimming the first object in each line. It's even part of the reason the language is easy to parse, both for the compiler and for human readers.2

改变Python以某种方式“逃避”语句-表达式鸿沟,除非以一种非常谨慎和有限的方式,否则会将其变成一种完全不同的语言,并且不再具有导致人们选择的许多好处首先是Python。

更改 Python 以生成大多数语句表达式(例如,Ruby)将再次将其变成完全不同的语言,而没有 Python 当前的优势。

And if Python did make either of those changes, then there'd no longer be a reason for lambda in the first place;2,3 you could just use def statements inside an expression.


改变Python来代替赋值表达式怎么样?嗯,很明显,这会破坏“您可以通过浏览每行中的第一个对象来读取状态变化”。尽管 Guido 通常关注的事实是if spam=eggs是一个错误,而不是一个有用的东西。

事实上,Python 确实为您提供了在需要时解决这个问题的方法,例如setattr甚至明确调用__setitem__ on globals(),并不意味着它应该有直接的语法支持。很少需要的东西不值得语法糖,对于那些非常不寻常的东西更是如此,以至于在实际完成时应该引起人们的注意和/或危险信号。


1. I have no idea whether that was Guido's understanding when he originally added lambda back in Python 1.0. But it's definitely the reason lambda wasn't removed in Python 3.0.

2. In fact, Guido has, multiple times, suggested that allowing an LL(1) parser that humans can run in their heads is sufficient reason for the language being statement-based, to the point that other benefits don't even need to be discussed. I wrote about this a few years ago http://stupidpythonideas.blogspot.com/2015/01/statements-and-expressions.html if anyone's interested.

3. If you're wondering why so many languages do have a lambda expression despite already having def: In many languages, ranging from C++ to Ruby, function aren't first-class objects that can be passed around, so they had to invent a second thing that is first-class but works like a function. In others, from Smalltalk to Java, functions don't even exist, only methods, so again, they had to invent a second thing that's not a method but works like one. Python has neither of those problems.

4. A few languages, like C# and JavaScript, actually had perfectly working inline function definitions, but added some kind of lambda syntax as pure syntactic sugar, to make it more concise and less boilerplatey. That might actually be worth doing in Python (although every attempt at a good syntax so far has fallen flat), but it wouldn't be the current lambda syntax, which is nearly as verbose as def.

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

为什么 Python 的 lambda 表达式中不允许赋值? 的相关文章

  • 如何正确地将 MIDI 刻度转换为毫秒?

    我正在尝试将 MIDI 刻度 增量时间转换为毫秒 并且已经找到了一些有用的资源 MIDI Delta 时间刻度到秒 http www lastrayofhope co uk 2009 12 23 midi delta time ticks
  • Python模块可以访问英语词典,包括单词的定义[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 python 模块 它可以帮助我从英语词典中获取单词的定义 当然有enchant 这可以帮助我检查该单词是否存在于英语中
  • 在 Python distutils 中从 setup.py 查找脚本目录的正确方法?

    我正在分发一个具有以下结构的包 mymodule mymodule init py mymodule code py scripts script1 py scripts script2 py The mymodule的子目录mymodul
  • if 语句未命中中的 continue 断点

    在下面的代码中 两者a and b是生成器函数的输出 并且可以评估为None或者有一个值 def testBehaviour self a None b 5 while True if not a or not b continue pri
  • 填充两个函数之间的区域

    import matplotlib pyplot as plt import numpy as np def domain x np arange 0 10 0 001 f1 lambda x 2 x x 2 0 5 plt plot x
  • Java 8 中函数式接口的使用

    这是来自的后续问题Java 8 中的 双冒号 运算符 https stackoverflow com questions 20001427 double colon operator in java 8其中 Java 允许您使用以下方式引用
  • 使用 OLS 回归预测未来值(Python、StatsModels、Pandas)

    我目前正在尝试在 Python 中实现 MLR 但不确定如何将我找到的系数应用于未来值 import pandas as pd import statsmodels formula api as sm import statsmodels
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • 如何解决使用 Spark 从 S3 重新分区大量数据时从内存中逐出缓存的表分区元数据的问题?

    在尝试从 S3 重新分区数据帧时 我收到一个一般错误 Caused by org apache spark SparkException Job aborted due to stage failure Task 33 in stage 1
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • 无法在 osx-arm64 上安装 Python 3.7

    我正在尝试使用 Conda 创建一个带有 Python 3 7 的新环境 例如 conda create n qnn python 3 7 我收到以下错误 Collecting package metadata current repoda
  • python Soap zeep模块获取结果

    我从 SOAP API 得到如下结果 client zeep Client wsdl self wsdl transport transport auth header lb E authenticate self login res cl
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 如何在 OSX 上安装 numpy 和 scipy?

    我是 Mac 新手 请耐心等待 我现在使用的是雪豹 10 6 4 我想安装numpy和scipy 所以我从他们的官方网站下载了python2 6 numpy和scipy dmg文件 但是 我在导入 numpy 时遇到问题 Library F
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数

随机推荐

  • 显示名称而不是电子邮件的电子邮件标题的格式是什么?

    我正在尝试创建一个 php 脚本 该脚本将使用 mySQL 数据库为我处理邮件列表 并且我已经准备好了大部分内容 不幸的是 我似乎无法让标题正常工作 而且我不确定问题是什么 headers From email protected cdn
  • Julia 中的 ifelse 和三元运算符有什么区别?

    假设我有这样的代码 cond true a cond 1 2 b ifelse cond 1 2 两种操作有什么区别 在你写的例子中 没有任何有效的区别 但是 如果这两个分支比简单的整数字面更复杂 则存在差异 julia gt f prin
  • 适用于 Android 的 OpenGL ES 工具

    在哪里可以找到用于在 OpenGL ES 中设计复杂对象的所有工具 像正方形 立方体 球体等 只需对对象进行建模并将其导出为 OBJ 文件 然后即可将 OBJ 文件加载到场景中 这是我编写的用于加载 OBJ 文件的代码 我将它们从 Maya
  • 无法删除 Kubernetes 中的所有 Pod - 清除/重启 Kubernetes

    我正在尝试删除 删除我的环境中运行的所有 Pod 当我发出 码头工人 我得到以下输出 这是一个示例屏幕截图 可以看到 都是K8 我想删除所有 Pod 删除它们 我尝试了以下所有方法 但它们不断出现 sudo kubectl delete a
  • std::async 是如何实现的?

    我想知道使用它有多合适std async在面向性能的代码中 具体来说 从工作线程捕获异常到主线程是否有任何惩罚 如何从worker返回到main的值 ref 传递的输入参数实际上永远不会被复制吗 我计划将一个繁重的会话对象传递给线程或写入s
  • kafka 和 kafka-client 有什么区别?

    我发现maven仓库里有几个kafka apache的maven仓库中有两个kafka https mvnrepository com artifact org apache kafka kafka https mvnrepository
  • 在Android中安排重复任务

    我正在设计一个应用程序 只要该应用程序位于前台 该应用程序就会重复执行将状态发送到专用服务器的任务 在我在网络上的搜索中 我看到了几种不同的方法 并想知道最好的方法是什么 安排服务器调用的最佳方式是什么 我看到的选项是 Timer http
  • GitHub 中未经验证的提交

    在我的 GitHub 存储库中 我有一个分支 其中有一些未经验证的提交 有什么办法可以将它们更改为已验证吗 未经验证意味着您的签名是错误的 如果您提交时使用了错误的电子邮件 密码 如果您尚未在 GitHub 上 在该帐户上 上传签名 或者上
  • Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

    我目前正在学习有关在 Spring Boot Web 应用程序中实现 JDBC 和使用数据库的更多信息 并且我遇到了在帖子底部编写的以下堆栈跟踪 我创建了一个简单的 Employee 模型 并且尝试在 main 所在的同一个类上执行一些数据
  • Lambda/Linq 包含多个关键字的条件

    我必须列出 带有评论字段的主列表 要搜索的关键字列表 我想搜索每条记录的每个注释字段中的关键字 在 SQL 中如下所示 select from MainList where Comment like keyword1 or Comment
  • 在Slave redis db上写入

    我有一个主 Redis 服务器 S1 还有 6 个其他服务器 我希望他们有本地redis从属服务器 因此redis主服务器上的任何更改都将复制到每个本地服务器上的从属服务器 我可以在一个从站上写入并让该从站更新主站 然后主站将更新其他从站吗
  • 从另一个浏览器打开一个浏览器[重复]

    这个问题在这里已经有答案了 我正在 Firefox 上运行我的 Web 应用程序 我在其中一个页面上有超链接 当我单击它时 它会打开另一个应用程序作为新的弹出窗口 但 Firefox 不支持该应用程序 所以我想在 Internet Expl
  • 将 Android CheckBox 设置为不同的图像...然后返回原始图像

    我正在使用以下 非常常见 代码来更改 Android 应用程序中的复选框图像 mCheck CheckBox findViewById R id chkMine mCheck setButtonDrawable R drawable my
  • 如何通过属性名称和/或值查找锚标记? [复制]

    这个问题在这里已经有答案了 这是我正在尝试自动化的网络 https www supremenewyork com shop sweatshirts xi9sboa21 u2te1fdw8 https www supremenewyork c
  • 为 Databricks 生成数据库架构图

    我正在创建一个 Databricks 应用程序 并且数据库架构变得非常重要 有没有办法为 Databricks 数据库生成架构图 类似于可以从 mysql 生成的架构图 有两种可能的变体 使用 Spark SQL 与show databas
  • 将 C/C++ 回调传递到 matlab 引擎

    我有一个 C 文件 启动 matlab 引擎 calls matlab optimize 一个编译后的 m 文件 在内部运行 matlab 优化器之一 打印结果 停止发动机并退出 这很好用 我现在想将第二行更改为 calls matlab
  • Xcode 文档图标未更新

    我创建了一个 icns并在我的项目的 文档类型 部分中进行设置 但 Finder 中的文档图标仍然是通用的 我注意到 如果更改文档类型的文件扩展名 则会显示该图标 是否有我需要清除的缓存或其他方式来更新图标而不更改文件扩展名 要强制刷新图标
  • Sequelize 同步与迁移

    我正在学习 Sequelize 我想了解一些有关同步与迁移的说明 我知道同步将根据我的模型架构创建丢失的表 但我还读到同步用于初始化数据库 而迁移用于生产 如果是这种情况 express example 显示调用同步来自bin www ht
  • 在哪里可以获得 MediaWiki 的模板?

    我注意到很多基于 mediawiki 的网站都使用 Robelbox Ambox 等模板 我在哪里可以获得它们以及如何安装它们 It s a PITA http www urbandictionary com define php term
  • 为什么 Python 的 lambda 表达式中不允许赋值?

    这不是重复的Python 中 lambda 表达式内的赋值 https stackoverflow com questions 6282042 assignment inside lambda expression in python 即我