Arrays 为具有eval和符号的数组赋值
我有一个有3个键的字典,每个键都有任意的2d数组。我想将这些值2D数组中的每一个分配给新创建的数组。所以我写了这个: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
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