- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我问是因为有人创建了一个 lambda 列表的经典问题:
foo = []
for i in range(3):
foo.append((lambda: i))
for l in foo:
print(l())
并且出乎意料地只得到了 twos 作为输出。通常提出的解决方案是使 i
成为这样的命名参数:
foo = []
for i in range(3):
foo.append((lambda i=i: i))
for l in foo:
print(l())
这会产生所需的输出 0, 1, 2
但现在发生了一些神奇的事情。它有点像预期的那样,因为 Python 是按引用传递的,而您不需要引用。
不过,只是为某物添加一个新名称,不应该只是创建另一个引用吗?
所以问题变成了当某物不是引用时的确切规则是什么?
考虑到 int 是不可变的并且以下工作:
x = 3
y = x
x = 5
print(x, y) // outputs 5 3
可能解释了为什么添加该命名参数有效。创建并捕获了具有相同值的本地 i
。
现在,为什么我们的 lambda 引用了相同的 i
?我将一个 int 传递给函数,它被引用,如果我将它存储在一个变量中,它就会被复制。嗯。
基本上,我正在寻找最简洁和抽象的方式来准确记住它是如何工作的。什么时候引用相同的值,我什么时候得到一个副本。如果它有任何通用名称并且存在相同的编程语言,那也会很有趣。
这是我目前的假设:
无论如何我都会问,只是为了确定并希望获得一些背景知识。
最佳答案
这里的问题是您如何看待名称。
在您的第一个示例中,i
是每次循环迭代时分配给的变量。当您使用 lambda
创建一个函数时,您创建了一个访问名称 i
并返回其值的函数。这意味着随着名称 i
的变化,函数返回的值也会发生变化。
默认参数技巧起作用的原因是在定义函数时评估名称。这意味着默认值是当时 i
名称指向的值,而不是名称本身。
i
是一个标签。 0
、1
和2
是对象。在第一种情况下,程序将 0
分配给 i
,然后创建一个返回 i
的函数 - 然后它用 1 执行此操作
和 2
。当函数被调用时,它会查找 i
(现在是 2
)然后返回它。
在第二个示例中,您将0
分配给i
,然后创建一个带有默认参数的函数。该默认参数是通过评估 i
获得的值 - 即对象 0
。这对 1
和 2
重复。当函数被调用时,它会将默认值分配给一个新变量 i
,该变量是函数的局部变量,与外部 i
无关。
关于python - 什么时候在 Python 中引入新名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16906444/
在开始之前,我想指出的是,我已经通过Google进行了一次诚实而真实的搜索,涉及范围很广,无法找到。 我需要(对于我正在开发的项目)所有Delphi(从2007年到最新发布的版本,我不再支持任何早于2
我正在使用 RPM 将 Liquibase 数据库迁移添加到我们当前的产品部署中,并正在寻找一些有关如何实现我的预期目标的建议/技巧。 最好,RPM 能够安装在全新且 Shiny 的开发人员环境以及现
我目前正在使用一本书学习 UITableViewCell。为了在滚动时重用单元格,作者要求修改原始代码以包含一个if()。检查特定重用标识符的单元格是否存在的语句。但是,在添加 if() 之后语句,X
在 C++ 中引入 protected 访问说明符背后的基本原理是什么。举个例子会有帮助。 最佳答案 对于这类问题,我推荐 Bjarne Stroustrup 的The Design And Evol
我正在尝试使用模板参数中给定的维度和类型创建一个可重用的矩阵类。结构本身就是: template struct Matrix { T elements[N* M]; }; 当我尝试实现矩阵乘
我有一个简单的查询: $query1="SELECT * FROM wp_users WHERE now() < (last_login + INTERVAL 6 month)"; $resu
在 Ioke doc 中,ISpec 测试包含在文档中,参见 ioke.org/dok/index.html 这如何用 Ruby 的 RSpec 和 RDoc(或 SDoc)来完成?我找不到任何命令行
在客户端/服务器通信中,我看到来自客户端的 TCP ZeroWindow。 在这种情况之后预期的场景是什么(设置和发送什么标志)? 以下是我可能得到的日志。在这种情况下,服务器发送 RST 数据包来终
来自wikipedia关于 Lambda 函数和表达式的文章: users will often wish to define predicate functions near the place w
我有一个由父 POM 和几个子模块组成的 Maven 项目。它在 Intellij 中编译和运行良好(我假设它使用 javac 而不是 Maven)。 当我运行 maven clean install
所以我刚开始使用 d3.js,但我一直收到 JavaScript 错误,我不知道为什么。我刚刚用 svg 创建了三个圆圈,想用 d3 选择它们。这是我的代码:
Objective C 引入了一种称为 ARC 的技术,以将开发人员从内存管理的负担中解放出来。听起来不错,如果g++也有这个功能,我想C++开发者会很高兴的。 ARC allows you to p
在 package.json 添加 "font-awesome": "^4.7.0" 执行 npm install 在 main.js 引入
为什么 WSDL 引入 wsdl:message?和消息部分? 与在操作参数(输入、输出、故障)中直接使用 XSD 相比,他们可以带来什么优势? 它们(带有 wsdl 消息部分的 wsdl 消息)如何
I already read doc here : https://github.com/laravel/framework/pull/25997 我想知道的是使用 withCount()我们只是加载
我已经为此苦苦挣扎了一段时间,但不太明白发生了什么。我有一个包含 Sides(通常是 2 个)的 Card 实体 - 并且 Cards 和 Sides 都有一个 Stage。我正在使用 EF Code
下面的 swiftUI 代码在 iOS13 上运行良好,但是在使用 iOS14 进行测试时,我在尝试显示模式表时遇到了由强制解包选项引起的 fatal error 。据我所知,工作表不应该尝试为 se
出于个人原因,我需要记忆一下 jsp 上的一些事情 :) 我有一个简单的登录页面: Login First name:
据我了解,PYTHONCASEOK 选项允许通过不区分大小写的匹配来导入模块。但是,由于 python 中的几乎所有内容都区分大小写,为什么它必须启用此选项以实现更惰性的写入。 还有什么介绍的理由吗?
全新的早午餐(和 bower )。我通过 bower 安装了 Bootstrap,我有以下早午餐配置文件: exports.config = # See http://brunch.io/#doc
我是一名优秀的程序员,十分优秀!