编辑:我在第一个答案后更改了示例代码,因为我提出了一个简单的版本,提出相同的问题.
我目前正在学习Common Lisp的范围属性.在我认为我有一个扎实的理解后,我决定编写一些我可以预测结果的例子,但显然我错了.我有三个问题,每个问题都与下面的例子有关:
例1:
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
*** - EVAL: variable X has no value
Run Code Online (Sandbox Code Playgroud)
问题:这是有道理的.x是静态范围的,fun2无法在没有显式传递的情况下找到x的值.
例2:
(defvar x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
5
Run Code Online (Sandbox Code Playgroud)
问题:我不明白为什么x对fun2突然可见,其值为fun1,而不是值为100 ...
例3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2 ()
(print x))
(fun1 5)
Run Code Online (Sandbox Code Playgroud)
输出:
5
100
Run Code Online (Sandbox Code Playgroud)
问题:我是否应该忽略这些结果,因为在未声明的变量上调用setf显然是未定义的?这恰好是我在第二个例子中所期望的......
任何见解将不胜感激......
>>> x = 'foo'
>>> {0: locals().get('x')}
{0: 'foo'}
>>> {0: locals().get('x' + spam) for spam in ['']}
{0: None}
Run Code Online (Sandbox Code Playgroud)
这种行为差异的原因是什么?
在 Julia 1.4.1 中,如果我在全局范围内定义一个函数,“if false”语句之后的修改不会影响它,正如预期的那样:
test()=0
if false
test()=1
end
println(test())
Run Code Online (Sandbox Code Playgroud)
这应该打印“0”。但是,当我将此代码包含在本地范围内时,行为会发生变化:
function main()
test()=0
if false
test()=1
end
println(test())
end
main()
Run Code Online (Sandbox Code Playgroud)
现在打印出我没想到的“1”。如果我将“测试”更改为数组或浮点数,我不会按预期观察到任何修改,即问题不会发生。为什么 Julia 对函数有这种行为?
我似乎无法理解JavaScript变量的特定范围.与我发现的其他示例和问题不同,我对嵌套函数的范围感兴趣.
我在这个JSFiddle上建立了一个例子.相关部分如下:
function MyObject() {
var self = this;
var a = 1;
this.b = 2;
var innerMethod = function() {
//1 and 2: direct reference
logMessage("a = " + a); // a = 1
//logMessage("b = " + b); // Error: b is not defined
//3 and 4: using this
logMessage("this.a = " + this.a); // this.a = undefined
logMessage("this.b = " + this.b); // this.b = undefined
//5 and 6: using self
logMessage("self.a = " + …Run Code Online (Sandbox Code Playgroud) 我写了这段代码:
x = 0
def counter():
x = 1
def temp(self):
print x
x += 1
return temp
Run Code Online (Sandbox Code Playgroud)
试图测试python是词法还是动态范围.我的想法是这样的
y = counter()
y()
Run Code Online (Sandbox Code Playgroud)
应该打印0或1,这将告诉我python如何作用域.但是,调用y会抛出一个异常,说x未定义.在理解Python如何工作的过程中,似乎存在一些根本性的缺陷.
谁能解释一下这是如何工作的?是的,我知道可以使用对象轻松完成.我正试图探索在不使用对象的情况下给出函数状态的想法.我用这种方式编写代码是因为上面翻译成像SCI这样的词汇范围的语言肯定会有效.
我在RStudio工作的一个简单的分析,我通过source命令来源一些文件.例如,我有一个简单的分析这个文件:
# Settings ----------------------------------------------------------------
data("mtcars")
source("Generic Functions.R")
# Some work ---------------------------------------------------------------
# Makes no sense
mtcars$mpg <- CleanPostcode(mtcars$mpg)
Run Code Online (Sandbox Code Playgroud)
该泛型函数文件有我用它来获得图形,做重复的任务一些简单的功能.例如,使用的CleanPostcode函数看起来像这样:
#' The file provides a set of generic functions
# String manipulations ----------------------------------------------------
# Create a clean Postcode for matching
CleanPostcode <- function(MessyPostcode) {
MessyPostcode <- as.character(MessyPostcode)
MessyPostcode <- gsub("[[:space:]]", "", MessyPostcode)
MessyPostcode <- gsub("[[:punct:]]", "", MessyPostcode)
MessyPostcode <- toupper(MessyPostcode)
cln_str <- MessyPostcode
return(cln_str)
}
Run Code Online (Sandbox Code Playgroud)
当我运行第一个文件时,对象在全局环境中可用:
文件中还有一些其他功能,但它们与描述的问题无关.
然而,RStudio认为对象在范围内不可用,如代码旁边的黄色三角形所示:
有没有办法让RStudio停止这样做.也许改变source命令的东西?我试过local …
鉴于以下功能
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
Run Code Online (Sandbox Code Playgroud)
如果在 R 中运行以下代码,为什么答案是 10?我对 y 如何处理这个问题有点困惑。
z <- 10
f(3)
Run Code Online (Sandbox Code Playgroud) 我想要通过一长串潜在的解释变量,依次回归每个反应变量.而不是粘贴模型公式,我正在考虑使用reformulate(),
如此处所示.
fun()下面的功能似乎完成了工作,适合所需的模型.但请注意,它在其call元素中记录了构造的公式对象的名称而不是其值.
## (1) Function using programmatically constructed formula
fun <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
#
# Call:
# lm(formula = ff, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
#
# Call:
# lm(formula = …Run Code Online (Sandbox Code Playgroud) 在http://shiny.rstudio.com/articles/scoping.html上,很好地解释了有光泽的范围规则.有3个环境或级别彼此嵌套:函数内,会话内和所有会话中可用的对象.使用< - 将更改您所在环境中的对象,<< - 将全局更改它,即对于所有会话.
如果我在会话中定义变量但想要在函数中更改它,该怎么办?
< - 只会在函数内更改它,因此其他函数无法读取,<< - 将为所有会话更改它.中间什么都没有?就像"只是一级"?
下面的代码适用于 Python 2,但不适用于 Python 3。有没有办法在 Python 3 中访问局部变量?或者这些情况的替代解决方案?
[('{name_var}_{i:02d}of{maxpg:02d}.{date_var}').format(i, **locals())
for i in range(start, end)]
Run Code Online (Sandbox Code Playgroud)
Python 3 中的错误:
关键错误:'local_var'
下面是上面的一个更简单的玩具示例(适用于 Python 2,但不适用于 3)
local_var = 'hello'
['{local_var}'.format(**locals()) for i in range(1)]
Run Code Online (Sandbox Code Playgroud)
Python 3 中的错误:
关键错误:'local_var'
scoping ×10
r ×4
python ×3
environment ×2
scope ×2
common-lisp ×1
dynamic ×1
function ×1
javascript ×1
julia ×1
lexical ×1
lisp ×1
locals ×1
python-3.x ×1
rstudio ×1
shiny ×1