![]() |
1
142
实际上,python的行为是定义好的。 三个独立的功能 是被创造出来的,但是他们每个人都有 关闭在其中定义的环境 -在这种情况下,是全局环境(如果循环被放置在另一个函数中,则是外部函数的环境)。这正是问题所在,尽管-在这种环境中, 我被变异了 关闭所有 参考相同的I . 这里是我能想到的最好的解决方案-创建一个函数creater和invoke 那个 相反。这将迫使 不同的环境 对于创建的每个函数, 不同的我 在每一个。
这就是将副作用和函数式编程混合在一起时会发生的情况。 |
![]() |
2
151
循环中定义的函数将继续访问同一个变量
为了评估
预期的工作如下:
|
![]() |
3
26
以下是使用
按预期输出0 2 4。 |
![]() |
4
13
看看这个:
这意味着它们都指向同一个i变量实例,循环结束后,该实例的值将为2。 可读的解决方案:
|
![]() |
5
7
发生的是捕获变量i,函数返回调用时绑定到的值。在函数语言中,这种情况永远不会出现,因为我不会反弹。然而,对于Python,以及您在Lisp中看到的那样,这不再是真的了。 与您的方案示例的区别在于do循环的语义。方案是通过循环每次有效地创建一个新的i变量,而不是像使用其他语言那样重用现有的i绑定。如果您使用在循环外部创建的不同变量并对其进行变异,那么您将在方案中看到相同的行为。尝试将循环替换为:
看一看 here 以便进一步讨论。 [编辑]描述它的更好方法可能是将do循环视为执行以下步骤的宏:
即相当于下面的python:
i不再是父作用域中的变量,而是它自己作用域中的一个全新变量(即lambda的参数),因此您可以得到所观察到的行为。python没有这个隐式的新范围,所以for循环的主体只共享i变量。 |
![]() |
6
4
我仍然不完全相信,为什么在某些语言中,这是以一种方式工作,而在另一种方式工作。在普通的Lisp中,它就像python:
打印“6 6 6”(请注意,这里的列表是从1到3的,并且是反向构建的)。 在方案中,它的工作方式与Perl类似:
版画“6 4 4” 正如我已经提到的,JavaScript在python/cl阵营中。这里似乎有一个实现决策,不同的语言以不同的方式进行处理。我很想知道到底是什么决定。 |
![]() |
7
2
问题是所有本地函数都绑定到相同的环境,因此也绑定到相同的环境
|
![]() |
8
1
变量
我倾向于实现您所追求的行为,如下所示:
对更新的响应
这不是世界性的
|
![]() |
9
0
行为背后的推理已经被解释过,并且发布了多种解决方案,但我认为这是最蟒蛇式的(记住,Python中的一切都是一个对象!)以下内容:
Claudiu的答案很好,使用了函数生成器,但是Piro的答案是一个黑客,说实话,因为它让我变成了一个“隐藏的”参数,有一个默认值(它会很好地工作,但不是“pythonic”)。 |
![]() |
Javran · 在IO内使用读取器“-->r”的意外行为? 8 年前 |
![]() |
Andrzej Gis · getLine懒惰吗? 8 年前 |
![]() |
toadly · 在新的YouTube设计中看到的延迟加载样式的文本? 8 年前 |
|
Varun Risbud · Scala lazy val解释 8 年前 |
![]() |
Shersh · 解码和来自aeson软件包的解码功能之间有什么区别? 8 年前 |
![]() |
Konrad · 在自定义dplyr函数中更改结果变量的名称 8 年前 |
![]() |
Michael Jones · 在这个评论中,懒惰评估的含义是什么? 9 年前 |