Arrays 为具有eval和符号的数组赋值

Arrays 为具有eval和符号的数组赋值,arrays,for-loop,julia,eval,symbols,Arrays,For Loop,Julia,Eval,Symbols,我有一个有3个键的字典,每个键都有任意的2d数组。我想将这些值2D数组中的每一个分配给新创建的数组。所以我写了这个: levels = (:easy, :medium, :hard) easy = []; medium = []; hard = []; curriculum = Dict((k=>rand(3,3) for k in levels)...); # dictionary with 3 keys - each key is a symbol for level in level

我有一个有3个键的字典,每个键都有任意的2d数组。我想将这些值2D数组中的每一个分配给新创建的数组。所以我写了这个:

levels = (:easy, :medium, :hard)
easy = []; medium = []; hard = [];
curriculum = Dict((k=>rand(3,3) for k in levels)...); # dictionary with 3 keys - each key is a symbol
for level in levels
    eval(level) = curriculum[level]
end
在执行过程中没有问题,但是当我在之后检查easy、medium或hard数组时,里面没有矩阵

这样做的正确方式是什么? B.R

编辑

我的理解是,在循环迭代期间,evallevel的行为类似于本地绑定。因此,在迭代结束时,它什么都不记得。但是为什么呢?如何再次转换为全局?

编辑Ismael在接受的答案和评论中指出,有一种更好的方法。即:

全局级别=级别不是必需的,请参见我的答案,问题是 如果要在表达式中插入符号作为 符号而不是标识符,然后需要包装符号 转换为另一个引用表达式

警告:这几乎肯定不是完成你想做的事情的最佳方式。julia中的元编程功能非常强大和有用,但您应该很少需要使用eval。你可以阅读更多关于它的内容。如果你问另一个问题,并详细说明你的最终目标,你可能会得到更好的答案:

尽管如此:

如果要以这种方式进行赋值,则必须创建一个表达式Expr,将矩阵对象赋值给具有所需名称的变量。但由于eval总是在全局范围内执行语句,因此需要使要使用的变量在全局范围内可用

 for level in levels
     global level = level
     eval(:($level = curriculum[level]))
 end
或者使用@eval宏:

for level in levels
     global level = level
     @eval $level = curriculum[level]
 end
正如伊斯梅尔在接受的答案和评论中指出的那样,有一种更好的方法。即:

全局级别=级别不是必需的,请参见我的答案,问题是 如果要在表达式中插入符号作为 符号而不是标识符,然后需要包装符号 转换为另一个引用表达式

警告:这几乎肯定不是完成你想做的事情的最佳方式。julia中的元编程功能非常强大和有用,但您应该很少需要使用eval。你可以阅读更多关于它的内容。如果你问另一个问题,并详细说明你的最终目标,你可能会得到更好的答案:

尽管如此:

如果要以这种方式进行赋值,则必须创建一个表达式Expr,将矩阵对象赋值给具有所需名称的变量。但由于eval总是在全局范围内执行语句,因此需要使要使用的变量在全局范围内可用

 for level in levels
     global level = level
     eval(:($level = curriculum[level]))
 end
或者使用@eval宏:

for level in levels
     global level = level
     @eval $level = curriculum[level]
 end
在执行过程中没有问题,但是当我在之后检查easy、medium或hard数组时,里面没有矩阵

我的理解是,在循环迭代期间,evallevel的行为类似于本地绑定。因此,在迭代结束时,它什么都不记得。但是为什么呢?如何再次转换为全球

问题在于,在for循环中的每次迭代中,您都在定义并重新定义eval函数,而不是像您所认为的那样执行赋值

easy=[];中等=[];硬=[] 1.-无需预先定义此变量

evallevel=课程[级别] 2.-警告:这被解释为短样式函数定义

julia>evallevel=课程[级别] 用1方法求值泛型函数 julia>级别=:容易,:中等,:难 :容易,:中等,:难 julia>课程=Dictk=>rand3,等级为k的3分。。。 Dict{Symbol,数组{Float64,2}},有3个条目: :中等=>[0.230877 0.244128 0.205712;0.649405 0.887568 0.957849;0.245076 0.476088 0.160561] :hard=>[0.0424943 0.157261 0.798607;0.590535 0.78125 0.704322;0.555827 0.675355 0.74026] :easy=>[0.715595 0.914093 0.517973;0.750787 0.489784 0.491666;0.1966 0.133281 0.249144] julia>对于级别中的级别 @eval$level=课程[$Meta.quotlevel] 终止 朱莉娅:很简单 3×3数组{Float64,2}: 0.715595 0.914093 0.517973 0.750787 0.489784 0.491666 0.1966 0.133281 0.249144 3.-在for循环内部,在第一次迭代中,$level被解释为easy变量标识符,而$Meta.quotlevel被解释为符号:easy,需要额外的quoting级别

朱莉娅>梅塔.quot:foo ::富 julia>Expr:quote,:foo ::富 在执行过程中没有问题,但是当我在之后检查easy、medium或hard数组时,里面没有矩阵

我的理解是,在循环迭代期间,evallevel的行为类似于本地绑定。因此,在迭代结束时,它什么都不记得。但是为什么呢?如何再次转换为全球

问题在于,您在for循环内的每次迭代中都定义并重新定义eval函数,而不是执行赋值 正如你所相信的

easy=[];中等=[];硬=[] 1.-无需预先定义此变量

evallevel=课程[级别] 2.-警告:这被解释为短样式函数定义

julia>evallevel=课程[级别] 用1方法求值泛型函数 julia>级别=:容易,:中等,:难 :容易,:中等,:难 julia>课程=Dictk=>rand3,等级为k的3分。。。 Dict{Symbol,数组{Float64,2}},有3个条目: :中等=>[0.230877 0.244128 0.205712;0.649405 0.887568 0.957849;0.245076 0.476088 0.160561] :hard=>[0.0424943 0.157261 0.798607;0.590535 0.78125 0.704322;0.555827 0.675355 0.74026] :easy=>[0.715595 0.914093 0.517973;0.750787 0.489784 0.491666;0.1966 0.133281 0.249144] julia>对于级别中的级别 @eval$level=课程[$Meta.quotlevel] 终止 朱莉娅:很简单 3×3数组{Float64,2}: 0.715595 0.914093 0.517973 0.750787 0.489784 0.491666 0.1966 0.133281 0.249144 3.-在for循环内部,在第一次迭代中,$level被解释为easy变量标识符,而$Meta.quotlevel被解释为符号:easy,需要额外的quoting级别

朱莉娅>梅塔.quot:foo ::富 julia>Expr:quote,:foo ::富
粘贴代码时,最好使其运行并产生可能不好的输出。在这种情况下,将负载替换为课程=Dictk=>rand3,3,表示级别中的k。。。这将有助于开发潜力answerers@DanGetz对不起,你说得对。我编辑过。粘贴代码时,最好让它运行并产生可能不好的输出。在这种情况下,将负载替换为课程=Dictk=>rand3,3,表示级别中的k。。。这将有助于开发潜力answerers@DanGetz对不起,你说得对。I edited.global level=level不是必需的,请参见我的答案,问题是如果要将符号作为符号而不是标识符插入表达式中,则需要将符号包装到另一个引号表达式中。global level=level不是必需的,请参见我的答案,问题是,如果要将符号作为符号而不是标识符插入表达式中,则需要将符号包装到另一个引号表达式中。很好!:请问你在哪里找到这些信息的?与凤阳王元英雄聊了很多天,大部分是在不太旧的好日子里。非常感谢凤阳我一个人玩了很多。如果您愿意,您可以在手册中添加一个这样的例子。@Liso现在关机的时候有更多的元编程例子,也许它们值得拯救?多亏了你们两个!:也许新的好日子就要来了;如果您愿意,也可以随时加入新网站!:德妮丝!:请问你在哪里找到这些信息的?与凤阳王元英雄聊了很多天,大部分是在不太旧的好日子里。非常感谢凤阳我一个人玩了很多。如果您愿意,您可以在手册中添加一个这样的例子。@Liso现在关机的时候有更多的元编程例子,也许它们值得拯救?多亏了你们两个!:也许新的好日子就要来了;如果您愿意,也可以随时加入新网站!:D