Python 在解释器或编译器的上下文中,什么是单元格?

Python 在解释器或编译器的上下文中,什么是单元格?,python,compiler-construction,closures,interpreter,rust,Python,Compiler Construction,Closures,Interpreter,Rust,Python代码对象有一个属性。文档中经常使用术语“单元格” 在其他的语言中,有锈。谷歌搜索表明它们与关闭有某种联系 在编程语言实现的上下文中,什么是单元?单元格解决了什么问题?在Python中,cell对象用于存储 假设您想要一个总是返回其参数特定部分的函数。您可以使用闭包来实现这一点: def multiplier(n, d): """Return a function that multiplies its argument by n/d.""" def multiply(

Python代码对象有一个属性。文档中经常使用术语“单元格”

在其他的语言中,有锈。谷歌搜索表明它们与关闭有某种联系


在编程语言实现的上下文中,什么是单元?单元格解决了什么问题?

在Python中,
cell
对象用于存储

假设您想要一个总是返回其参数特定部分的函数。您可以使用闭包来实现这一点:

def multiplier(n, d):
    """Return a function that multiplies its argument by n/d."""
    def multiply(x):
        """Multiply x by n/d."""
        return x * n / d
    return multiply
以下是您如何使用它:

>>> two_thirds = multiplier(2, 3)
>>> two_thirds(7)
4.666666666666667
2/3
如何记住
n
d
的值?它们不是定义了
multiply
multiply
函数的参数,它们不是在
multiply
中定义的局部变量,它们不是全局变量,因为
multiplier
已经终止,它的局部变量不再存在,对吗

当编译
乘法器
时,解释器会注意到
乘法
稍后将要使用其局部变量,因此它会记录它们:

>>> multiplier.__code__.co_cellvars
('d', 'n')
然后,当调用
multiplier
时,这些外部局部变量的值作为
单元格
对象的元组存储在返回函数的
闭包
属性中:

>>> two_thirds.__closure__
(<cell at 0x7f7a81282678: int object at 0x88ef60>,
 <cell at 0x7f7a81282738: int object at 0x88ef40>)
您可以使用单元格的
cell\u contents
属性获取单元格的内容:

>>> {v: c.cell_contents for v, c in zip(
        two_thirds.__code__.co_freevars,
        two_thirds.__closure__
)}
{'d': 3, 'n': 2}

在介绍闭包的Python增强方案中,您可以阅读更多关于闭包及其实现的信息:。

在Rust中,
Cell
只是一种绕过继承的不可变性的方法,这样您就可以修改数据,尽管有不可变的引用。这与Python的意思完全不同。“细胞”是一个相当通用的术语,你知道。@ChrisMorgan在我提到的两种情况下听起来都很熟悉细胞。您愿意提交一个答案吗?我对Python代码对象表示的内部结构不太熟悉,但我可以猜测“cell”的含义。是否可以修改其中一个存储变量以在创建后更改函数?(例如d=5)
>>> {v: c.cell_contents for v, c in zip(
        two_thirds.__code__.co_freevars,
        two_thirds.__closure__
)}
{'d': 3, 'n': 2}