2.4 可变数据 #109
Replies: 15 comments 6 replies
-
看不懂 |
Beta Was this translation helpful? Give feedback.
-
约束传递实现看的一头雾水😥 |
Beta Was this translation helpful? Give feedback.
-
2.4.4 局部状态 中的 “以下运行环境图展示了多次调用由 make_withdraw 创建的函数的效果”不是对应的make_withdraw代码 |
Beta Was this translation helpful? Give feedback.
-
约束传递这部分我理解应该是 将整个计算过程,拆解成许多子模块。 |
Beta Was this translation helpful? Give feedback.
-
在2.4.4最后一段第一句话这样用中文表达是不是更加合理,“当你在函数内部给一个变量赋值时,Python 会将这个变量视为局部变量。如果在赋值之前尝试引用这个变量,并且它在当前帧中还没有被定义,Python 会抛出一个 UnboundLocalError 异常。” |
Beta Was this translation helpful? Give feedback.
-
凌晨三点给我头都看大了 😢 |
Beta Was this translation helpful? Give feedback.
-
看的头大 |
Beta Was this translation helpful? Give feedback.
-
看得确实头大... |
Beta Was this translation helpful? Give feedback.
-
虽然很抽象,但是内容很好啊 |
Beta Was this translation helpful? Give feedback.
-
看的头大 |
Beta Was this translation helpful? Give feedback.
-
这一章的内容虽然有点难啃,但是关于变量的查值顺序(scope)等真的帮助很大🥲(让我们感谢ChatGPT) 不过一次看完真的有点头大。。。分两部分看吧,实现的感觉可以放在第二部分再看! |
Beta Was this translation helpful? Give feedback.
-
疑问: >>> def outer():
x = "outer-x"
def middle():
x = "middle-x"
def inner():
nonlocal x
x = "inner-x"
inner()
print("middle:", x)
middle()
print("outer:", x)
outer()
#输出
middle: inner-x
outer: outer-x 如果是这种情况,相应的变化并不是更新到x第一次被声明的地方,更严谨的说法应该是改变的是最近的,非全局的那个作用域中存在的相应变量 |
Beta Was this translation helpful? Give feedback.
-
简单的总结,约束器与连接器的主要作用是进行非线性的运算,在已知等式关系的情况下,给定某一值进行运算,求解等式关系的其他值。 |
Beta Was this translation helpful? Give feedback.
-
2.4.5 更深层的意义:创建“对象”的雏形 这其实就是面向对象编程(OOP) 中“对象”的雏形!一个对象将数据和对数据的操作捆绑在一起。———— 来自deepseek |
Beta Was this translation helpful? Give feedback.
-
deepseek: 好的,CS61A 的 2.4.9 节“约束传递”(Constraint Propagation)是一个非常有趣但也确实容易让人困惑的话题。它引入了一种全新的编程范式。 我会用一个清晰的类比和分解来帮你理解它。 核心思想:什么是约束传递? 给 a 赋值 1 a = 1 给 b 赋值 2 b = 2 计算 c = a + b,得到 3 约束传递则反其道而行之。它的理念是: 你可以: 告诉系统:c = a + b(这是一个“约束”)。 然后告诉系统:a 是 1。系统会知道 a 变了,但因为它还不知道 b 和 c,所以什么也不计算。 再告诉系统:b 是 2。系统检测到变化,发现现在 a 和 b 都知道了,于是自动计算出 c = 3 并设置好。 你甚至可以反过来,先告诉系统 c 是 10 和 a 是 4,系统会自动推导出 b 必须是 6。 一个绝佳的类比就是 Excel 表格: 你在单元格 A1 输入 1 在单元格 B1 输入 2 在单元格 C1 输入公式 =A1+B1 (这就是一个“约束”) Excel 会自动显示 3。 如果你后来把 A1 改成 5,C1 会自动变成 7。 约束传递系统就是一个用 Python 实现的、迷你版的、可编程的 Excel。 系统的三个核心组成部分
关键特性: 它不知道自己怎么被计算出来,它只关心 “我是谁?” 和 “我的值变了,需要通知谁?”。 它有三个核心方法: set_value(source, new_value): 某个人(source)试图给我赋予一个新值。 get_value(): 获取我当前存储的值。 connect(constraint): 告诉连接器,某个约束关心你的值的变化。当你的值改变时,需要通知这个约束。
关键特性: 它知道如何计算,但通常不自己存储数据。它关心 “我的输入是谁?” 和 “如果我的某个输入变了,我该如何更新其他输入输出以维持关系?”。 它的核心方法: new_value(): 当某个连接的连接器值发生变化时,会调用这个方法。约束在这个方法里决定该做什么(例如,计算新的值并设置到另一个连接器)。 forget_value(): 当某个连接的连接器值被撤销时,会调用这个方法。约束需要处理“未知”状态。
它做什么? 它创建一个约束对象(比如一个加法器约束),然后调用 a.connect(约束)、b.connect(约束)、c.connect(约束),告诉这三个连接器:“以后你们的值有任何变化,都要通知这个加法器约束”。 关系图: text 工作流程示例 (以加法器 adder 为例) python a.set_value('user', 10) 设置第一个值 (a.set_value('user', 10)): a 连接器收到指令,要把自己的值设置为 10。 a 连接器说:“好的,我的值现在是10了。另外,我记得有个加法约束关心我,我得去通知它一下。” a 连接器调用加法约束的 new_value() 方法,说:“嗨,我(a)变了!” 加法约束被唤醒,它检查所有输入:a 是10,但 b 还不知道(是None),c 也不知道。所以它什么也做不了,只能等待。 设置第二个值 (b.set_value('user', 5)): b 连接器收到指令,把值设置为 5。 b 连接器更新自己的值,然后也去通知加法约束。 加法约束再次被唤醒。它检查所有输入:a 是10,b 是5,都知道了!而 c 还不知道。 约束开始履行它的职责:它根据规则 c = a + b 计算出 c 应该是 15。 它调用 c.set_value('adder', 15)。注意这里的 source 是 'adder' 而不是 'user',意思是这个值是由加法器计算得出的,不是用户直接设置的。 c 连接器收到指令,将自己的值设置为15。它也会通知所有关心它的约束(比如可能还有一个乘法约束也连着 c)。 至此,整个系统通过“值变化 -> 通知约束 -> 约束计算 -> 设置新值 -> 触发新的通知...”的链条,自动地将信息(约束)传递(Propagation) 开来,保证了声明的所有关系始终得到满足。 为什么要学这个? 模拟物理世界:很多系统天生就是由约束驱动的(比如电路、物理结构、报表)。用约束系统来建模它们非常直观。 理解计算模型:它展示了数据流(Dataflow)的一种实现方式,即计算是由数据(值)的可用性所驱动的。 总结一下: 希望这个解释能帮你打开思路!如果对具体的代码实现有疑问,可以再提出。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
2.4 可变数据
SICP Python 中文翻译
https://composingprograms.netlify.app/2/4
Beta Was this translation helpful? Give feedback.
All reactions