我认为我从根本上不了解Python如何完成变量范围和名称解析之类的事情。特别是broken()以下功能无法正常工作的事实令我感到惊讶。而且,尽管我在网上闲逛了一段时间以寻找有用的解释,但我仍然不明白。任何人都可以解释或链接到有关这些内容在Python中如何工作的良好描述,并提供足够的详细信息,使您broken()在阅读相关材料后似乎不起作用是显而易见的?
# Why does this code work fine
def okay0():
def foo():
L = []
def bar():
L.append(5)
bar()
return L
foo()
# and so does this
def okay1():
def foo():
def bar():
L.append(5)
L = []
bar()
return L
foo()
# but the following code raises an exception?
def broken():
def foo():
L = []
bar()
return L
def bar():
L.append(5)
foo()
# Example
test_list = [okay0, okay1, broken]
for test_function in test_list:
try:
test_function() …Run Code Online (Sandbox Code Playgroud) 如果我没记错的话,“懒惰的命令式编程语言”的概念很有意义。
例如,我设想以下代码应使程序打印“ 7”
a <- 1
b <- a+5
a <- 2
print([b])
Run Code Online (Sandbox Code Playgroud)
而以下代码应使程序打印“ 6”
a <- 1
b <- [a+5]
a <- 2
print(b)
Run Code Online (Sandbox Code Playgroud)
并且以下代码应使程序打印字符串“ a + 5”
a <- 1
b <- a+5
a <- 2
print(b)
Run Code Online (Sandbox Code Playgroud)
这个想法是[..]通过使用每个变量的当前值执行评估来使表达式变平。
题。是否存在惰性命令式编程语言,如果不存在,为什么不呢?有什么特殊原因使它们永远不存在?
进入R控制台,输入:
#First code snippet
x <- 0
x <- x+1
x
Run Code Online (Sandbox Code Playgroud)
你会得到'1'.这是有道理的:这个想法是'x + 1'中的'x'是x的当前值,即0,这用于计算x + 1的值,即1,然后将其铲入容器x.到现在为止还挺好.
现在输入:
#Second code snippet
f <- function(n) {n^2}
f <- function(n) {if (n >= 1) {n*f(n-1)} else {1}}
f(5)
Run Code Online (Sandbox Code Playgroud)
你会得到'120',这是5阶乘.
我觉得这很令人困惑.遵循第一个代码片段的逻辑,我们可能期望表达式中的'f'
if (n >= 1) {n*f(n-1)} else {1}
Run Code Online (Sandbox Code Playgroud)
被解释为f的当前值,即
function(n) {n^2}
Run Code Online (Sandbox Code Playgroud)
根据这个推理,f(5)的值应该是5*(5-1)^ 2 = 80.但这不是我们得到的.
题.这里到底发生了什么?R如何知道不使用旧的'f'?
如果将pracma包加载到r控制台并键入
gammainc(2,2)
Run Code Online (Sandbox Code Playgroud)
你得到
lowinc uppinc reginc
0.5939942 0.4060058 0.5939942
Run Code Online (Sandbox Code Playgroud)
这看起来像某种命名元组或其他东西.
但是,我无法弄清楚如何提取下面的数字lowinc,即0.5939942.代码(gammainc(2,2))[1]不起作用,我们得到
lowinc
0.5939942
Run Code Online (Sandbox Code Playgroud)
这不是一个数字.
这是怎么做到的?