python - 为什么 `lambda: MyClass()` 是合法的,但 `MyClass()` 本身是非法的?
问题描述
以下代码是合法的:
class MyClass:
print(lambda: MyClass())
class MyClass:
print(lambda: self())
class MyClass:
children = defaultdict(lambda: MyClass())
mc = MyClass()
print(mc.children)
cc = mc.children[0]
print(cc.children)
但是,以下代码是非法的:
class MyClass:
def f(): return MyClass()
print(f()) #=> NameError: name 'MyClass' is not defined
class MyClass:
children = MyClass() #=> NameError: name 'MyClass' is not defined
class MyClass:
children = self() #=> NameError: name 'self' is not defined
MyClass
我的问题是,为什么self
一旦defined
包裹在 lambda 中?
(我在玩 Trie 结构并试图理解为什么 TrieNode 必须定义为一个单独的类。TrieNode 基本上是一个用 定义的单行类children = defaultdict(lambda: TrieNode())
)
解决方案
传递给defaultdict
in 的工厂函数:
class TrieNode:
children = defaultdict(lambda: TrieNode())
在类定义期间不调用。一旦定义了类,函数就可以从封闭的命名空间访问类名。以下将失败并出现您遇到的类似错误:
class TrieNode:
children = defaultdict(lambda: TrieNode())
children[4] # calls factory function before class is defined!
NameError: name 'TrieNode' is not defined
一个更生动的例子来说明封闭的命名空间事实:
class TrieNode:
children = defaultdict(lambda: TrieNode())
t = TrieNode()
TrieNode = int
t.children[5]
# 0
# [sic!] ...
# ... t is still a TrieNode from the earlier class definiton,
# but the factory function uses the latter override from the enclosing namespace
推荐阅读
- c# - Recipients.ResolveAll 一半失败
- react-native - 运行弹出时出错:错误:连接已禁用
- python-3.x - 在 python 中使用 mpmath 绘图时如何标记轴?
- html - Html中的嵌套类,最里面的类的Css样式
- php - PHPMailler 错误(页面无法显示,因为发生了内部服务器错误。)
- spring-integration - 调用 SimpleWebServiceInboundGateway.invoke 方法时出错
- javascript - 学习测试Vue.js项目:产品展示列表
- node.js - 使用 async / await 一个一个地读取文件
- python - Python程序不记得变量
- html - 如何从输入中删除黑色顶部和左侧轮廓