我想给一个lambda的作用域分配一个变量,这个lambda被多次调用。每次都有一个新的变量实例。我该怎么做?

f = lambda x: x + var.x - var.y

# Code needed here to prepare f with a new var

result = f(10)

在本例中,它是var,我希望在每次调用时都替换它,而不将其作为第二个参数。

不要使用lambda,使用常规函数,你不应该觉得有必要尽可能使用lambda。

一般来说,如果lambda足够复杂,以至于您必须询问如何扭曲它来完成任务,那么只需使用常规的"def"函数即可。它将使代码更可读、更可维护。

@我同意。但是lambda或者正则函数,我不确定OP是如何完成他所要求的。在不使用参数的情况下,如何更改函数范围内的某些内容?

如果这有帮助,可以用常规函数替换lambda。我只需要以某种方式操作函数局部变量/闭包。

如何在python中修改本地名称空间或如何动态修改函数的本地名称空间的可能副本?@JonathonReinhart有几种方法,但在那些链接中看不到干净的方法。

@正在引用命名空间的Jamyak。这真的适用于函数范围的变量吗?

@JonathonReinhart是的,另外Op规定他不能在lambda定义中添加另一个参数,因此没有其他方法

@查米拉克,对。整个事情开始显得荒谬起来。

lambda是在外部定义的,超出了我的控制范围,但我想为lambda创建者提供一个范围。这样做更有意义吗?

在lambda的作用域中未定义的变量是从调用它的点的调用作用域中解析出来的。

一个稍微简单的例子…

>>> y = 1

>>> f = lambda x: x + y

>>> f(1)

2

>>> y = 2

>>> f(1)

3

…所以,在调用你的lambda之前,你只需要在调用范围中设置var,尽管在y是"常量"的情况下,这更常用。

该函数的反汇编显示…

>>> import dis

>>> dis.dis(f)

1           0 LOAD_FAST                0 (x)

3 LOAD_GLOBAL              0 (y)

6 BINARY_ADD

7 RETURN_VALUE

如果您想在定义lambda时将y绑定到一个对象(即创建一个闭包),通常会看到这个习语…

>>> y = 1

>>> f = lambda x, y=y: x + y

>>> f(1)

2

>>> y = 2

>>> f(1)

2

…因此,在定义lambda后,对y的更改没有效果。

该函数的反汇编显示…

>>> import dis

>>> dis.dis(f)

1           0 LOAD_FAST                0 (x)

3 LOAD_FAST                1 (y)

6 BINARY_ADD

7 RETURN_VALUE

虽然这很漂亮,而且是手术室的要求,但我为必须保持这一点的可怜的小混蛋感到抱歉。"在这个lambda里,y到底是从哪里来的?!"在本例中可能很明显,但在更大的项目中则不明显。记住python的成语"显式而非隐式"…我不认为这是明确的。

@乔纳森·莱因哈特,我同意。我主要是因为其他答案暗示这是不可能的,所以我只是想证明这是可能的。这是不是一个好主意是主观的。对于OP想要实现的目标,可能有一个更好的解决方案,但是最初的问题并没有包含足够的信息来做出决定。

f = functools.partial(lambda var, x: x + var.x - var.y, var)将为您提供一个参数(x的函数(f,其中var固定在定义点的值上。

不能在lambda表达式中使用赋值语句,因此必须使用正则命名函数:

def f(x):

global var

var = x

注意使用"global"关键字。如果没有它,python将假定您想要在函数的本地范围内创建一个新的"var"变量。

UPS。抱歉,假定您要分配给变量,而不是对象字段。在这种情况下不需要"全局"(因为您没有引入新的绑定)。

我不认为使用一个全局来"为一个函数的作用域分配一个变量"。这是一个全局范围的变量。

我不确定这对我的案件有什么帮助?

@jonasklemming如果变量在全局范围内,那么从外部更改它将在任何地方更改它,包括在函数内部。这是个坏主意,但会奏效的。

我同意这是一个糟糕的答案。我误解了这个问题。

啊,好吧,也许使用全局是一个解决方案。

为什么不能在lambda表达式中使用赋值语句?

因为赋值只能用作语句,所以它不是有效的表达式。

使其成为另一个参数:

f = lambda x,var: x + var.x - var.y

result = f(10, var)

lambda或正则函数,在函数范围内更改变量的唯一方法是通过参数。

谢谢,这是我的第一个想法,但我想避免第二次争吵。

那么你还能怎么做呢?如何控制每次调用f时var是什么?

我希望有一种方法可以操纵F的关闭

在这种情况下,是的,重新定义lambda,每个你想使用它的地方。似乎很傻很费解。(即难以理解、维护等)

为什么要避免第二次争吵?如果你想要两个数据,为什么要掩盖它?

是的,这不是一个可以接受的解决方案,也许这是不可能的。

避免两个参数的原因是第二个参数很少使用,但有些情况下需要它,我希望尽可能地保持lambda的琐碎。

好吧,但如果不使用,那么什么是var?这变得如此复杂。也许你需要提供更多的信息/代码来帮助我们理解你到底想做什么。我会考虑删除整个问题并重新开始。

不过,谢谢您的意见!

python给变量赋值范围_关于lambda:在Python中将变量赋值给本地函数范围相关推荐

  1. python中声明变量注意事项_我们如何在Python中声明变量?

    简短的答案是,无需在Python中声明变量. 以下是更详细的描述. 静态类型语言(C,C ++,Java,C#)要求在程序中使用变量之前,必须先声明要使用的变量的名称和类型声明.相应的语言编译器确保将 ...

  2. python一节课多久_第一节课 python简介

    标签: 一.python特性概要 1. Python是解释性语言.我们和c比较一下. 2. Python特性总结:字节码.动态.缩进 2.1 字节码 2.2 动态语义 在赋值时确定数据类型 2.3 缩 ...

  3. python导入模块的常用方法_(9)python模块的定义、导入、优化,常用模块

    [1]模块的定义 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑等:核心就是实现一个功能)本质上就是.py结尾的 python 文件 比如: 文件名 test.py ,对应的模块名就是 ...

  4. python图形界面设计代码_(八)Python 图形化界面设计

    3.1.文本输入和输出相关控件:文本的输入与输出控件通常包括:标签(Label).消息(Message).输入框(Entry).文本框(Text).他们除了前述共同属性外,都具有一些特征属性和功能. ...

  5. python是什么语言汇编_编程语言及python介绍

    编程语言及python介绍 1.编程语言分类 机器语言 优点:执行效率高 缺点:开发效率极低,跨平台性差 汇编语言 优点:较机器语言执行效率稍低 缺点:较机器语言开发效率稍高,仍然很低,跨平台性差 高 ...

  6. python通讯录运用的知识点_案例驱动式Python学习--通讯录存取

    驱动案例 通讯录:要求打印出企业全部十名员工通讯录.(要求有文件相关操作) 内置函数 自定义函数 函数指被封装起来的.实现某种功能的一段代码.Python安装包.标准库中自带的函数统称为内置函数,用户 ...

  7. 小猿圈python之python期末考试测试题(二)_小猿圈Python开发面试题(一)

    如果准备去找工作,建议练习一下再去,做充分的准备,去迎接面试!小猿圈加加老师给整理了一套面试题,后续还会有,想要看答案的同学可以给我留言. 一.问答题 1.说一下什么是可变类型什么是不可变类型? 2. ...

  8. python科学计算教程视频_【P14】Python科学计算与图形渲染库视频课程视频教程 it教程...

    Python视频教程名称: Python科学计算与图形渲染库视频课程视频教程 Python视频教程 [IT视频教程网-www.itspjc.com] it教程 6 T6 ^9 L+ E4 C, }0 ...

  9. 趣学python教孩子学编程_《趣学Python——教孩子学编程》学习笔记第1-3章

    第1章 Python不是大蟒蛇 1.1 关于计算机语言 计算机程序是一组让计算机执行某种动作的指令.软件就是计算机程序的集合. 一种编程语言就是一种特定的与计算机交谈的方式,这种方式使用计算机和人都能 ...

  10. python是高级程序语言_高级语言程序设计(Python)_中国大学MOOC(慕课)

    课程概述 "高级语言程序设计"类课程面向无编程基础的学生,培养其运用编程语言解决实际问题的编程能力,使学生掌握一门编程语言的基本语法.语句.控制结构以及结构化程序设计的基本思想和方 ...

最新文章

  1. BeeHive模块注册
  2. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...
  3. JMS学习六(ActiveMQ消息传送模型)
  4. SPH算法(求最小代价树)
  5. Tomcat 项目代码上线步骤详解
  6. 《精通Spring 4.x 企业应用开发实战》读书笔记
  7. 【Spring 基础注解】对象创建相关注解、注入相关注解、注解扫描详解
  8. 服装关键点检测算法(CNN/STN)含(4点、6点以及8点)
  9. weak引用表原理探究
  10. 谷歌开源量子计算框架Cirq
  11. Python 将时间戳转换为本地时间并进行格式化
  12. 如果突然多了一笔财富。。
  13. qq代码大全可复制_给QQ换上“彩色动态昵称”,太酷了!
  14. 大一python实验二答案_python实验二
  15. 在墨刀中使用思维导图
  16. 一个月黑风高的夜晚紧急完成gitlab服务器数据迁移
  17. ue4Make Rot From x
  18. steam无法连接至计算机,win10系统打开steam提示无法连接至steam网络的图文方法
  19. Cesium设置实体初始偏移量
  20. quickpc易办公微型计算机,QuickPC抄板方法.doc

热门文章

  1. OpenCASCADE:使用 XSTEPDRAW
  2. OpenCASCADE:形状愈合之形状加工
  3. boost::signals2模块thread_safe_signals 库替代线程模型的基本测试
  4. boost::mp11::mp_take相关用法的测试程序
  5. boost::graph::distributed::mpi_process_groupboost::graph::用法的测试程序
  6. boost::graph模块实现使用不相交的集合数据结构计算无向变化的连通分量图形的测试程序
  7. ITK:比较两个图像并将输出像素设置为最大
  8. DCMTK:类DcmOther64bitVeryLong的测试程序
  9. VTK:几何对象之PlatonicSolids
  10. OpenCV使用基本算法检测颜色检查器