获取Julia语言中当前变量的列表

74

我是Julia语言的新手,之前使用过Matlab。

在Matlab中,当我输入 whos 命令时,我会得到当前作用域内的所有变量;并且,我可以将它们存储在另一个变量中,如 x=whos;。在Julia中是否存在类似的命令呢?
以下是Matlab示例代码:

>> a=3;
>> b=4;
>> whos
Variables in the current scope:

Attr Name        Size                     Bytes  Class
==== ====        ====                     =====  ===== 
    a            1x1                          8  double
    b            1x1                          8  double
    prefix       1x16                        16  char

Total is 18 elements using 32 bytes.
5个回答

56

更新:

whos() 

无论在iJulia还是在Julia-1.0.0的命令提示符中,...都无法工作。

但在Julia-0.6.4中可以正常工作。

另一方面,

varinfo()

...打印关于模块中导出的全局变量的信息。例如:

julia-1.0> varinfo()
name                    size summary                        
–––––––––––––––– ––––––––––– –––––––––––––––––––––––––––––––
Base                         Module                         
Core                         Module                         
InteractiveUtils 154.271 KiB Module                         
Main                         Module                         
PyPlot           781.872 KiB Module                         
ans               50.323 KiB Plots.Plot{Plots.PyPlotBackend}
myrepl               0 bytes typeof(myrepl)                 
x                   88 bytes 1×6 Array{Int64,2}             
y                    0 bytes typeof(y)                      

希望这对你有所帮助。


8
这应该是新的答案。 - John Greene
在Jupyterlab中,这甚至会生成一个漂亮格式的表格 - 谢谢! - Nils L.

39

你可以像Matlab命令一样使用Julia的whos函数。

julia> whos()
Base                          Module
Core                          Module
Main                          Module
ans                           Nothing

julia> x = 5
5

julia> whos()
Base                          Module
Core                          Module
Main                          Module
ans                           Int64
x                             Int64

使用 using 导入到本地作用域的任何模块(包/库)也会出现在列表中(作为像上面的 Base、Core 和 Main 那样的 Module)。

此外,您可以查询模块导出的名称。 Base 是包含标准库的模块。

julia> whos(Base)
!                             Function
!=                            Function
!==                           Function
$                             Function
%                             Function
&                             Function
*                             Function
+                             Function
.... (lots and lots more)
考虑到结果会超出屏幕范围,你可以理解为什么需要过滤结果。这时你可以使用正则表达式(Regexes)来进行过滤。(有关Julia的正则表达式的更多信息,请参见本手册章节)。
julia> whos(r"M")
Main                          Module

julia> whos(Base, r"Match"i)
DimensionMismatch             DataType
RegexMatch                    DataType
each_match                    Function
eachmatch                     Function
ismatch                       Function
match                         Function
matchall                      Function

在你的提问之前,我并不知道whos函数,所以感谢你帮助我学到了新东西。 :)

GitHub上的Julia问题#3393是关于添加内存大小到whos输出的。它还提到将whos返回一个值而不仅仅是打印出信息。


嗯,我明白了!我认为这是Julia Studio的问题。whos命令在命令提示符上可以正常工作。 - vinu k n
2
你有没有考虑使用 IJulia 笔记本代替 Julia Studio? - astrieanna

27

我不确定是否有更好的选择,但是

names(Main)[4:end]

看起来是有效的。 [4:end] 的部分是因为它包括 :Main:Core:Base,我认为你不会想要它们。我希望它们总是在开头。


输出按字母顺序列出,因此通常前四个条目将不包括:Main、:Core和:Base。 - glwhart

8

whos()在Julia的新版本(1.0及以上)中不再可用。请使用varinfo()代替。例如:varinfo(Core,r".*field.*")


4

从版本1.1开始还有@locals宏

实验性的宏Base.@locals返回当前局部变量名和值的字典

发布说明


请注意,正如引文中所提到的,这仅涵盖局部变量。 - carstenbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接