7.3 变量状态

在编写简单的一次性程序时,能够方便地在提示符下查看当前有哪些变量可用。函数 who 及其同类函数 whoswhos_line_format 会显示内存中的不同信息,如下所示。

str = "A random string";
who
 -| Variables in the current scope:
 -|
 -| ans  str
 
who
who pattern …
who option pattern …
C = who (…)

列出当前定义的与给定模式匹配的变量。

有效的模式语法与 clear 命令中描述的相同。如果未提供任何模式,则列出所有变量。

默认情况下,仅显示在本地作用域中可见的变量。

以下是有效的选项,但不能组合使用。

global

列出全局作用域中的变量,而非当前作用域中的变量。

-regexp

在匹配要显示的变量时,这些模式被视为正则表达式。使用与 regexp 函数接受的相同模式语法。

-file

下一个参数被当作文件名处理。列出在指定文件中找到的所有变量。从文件读取变量时不接受任何模式。

如果作为函数调用,则返回与给定模式匹配的已定义变量名称的元胞数组。

另请参阅: whosisglobalisvarnameexistregexp

 
whos
whos pattern …
whos option pattern …
S = whos ("pattern",…)

提供与给定模式匹配的当前定义变量的详细信息。

选项和模式语法与 who 命令相同。

每个变量的扩展信息汇总在一个表中,该表包含以下默认条目。

Attr

所列变量的属性。可能的属性有:

blank

本地作用域中的变量

c

复数类型的变量。

f

形式参数(函数参数)。

g

具有全局作用域的变量。

p

持久变量。

Name

变量的名称。

Size

变量的逻辑大小。标量为 1x1,向量为 1xN 或 Nx1,二维矩阵为 MxN。

Bytes

当前用于存储变量的内存量。

Class

变量的类。示例包括 double、single、char、uint16、cell 和 struct。

该表可以通过函数 whos_line_format 自定义以显示更多或更少的信息。

如果 whos 作为函数调用,则返回与给定模式匹配的定义变量名的结构体数组。描述每个变量的结构体字段包括:name、size、bytes、class、global、sparse、complex、nesting、persistent。

另请参阅: whowhos_line_format

 
val = whos_line_format ()
old_val = whos_line_format (new_val)
old_val = whos_line_format (new_val, "local")

查询或设置命令 whos 使用的格式字符串。

完整的格式字符串为:

%[modifier]<command>[:width[:left-min[:balance]]];

以下命令序列可用:

%a

打印变量的属性(c=复数、s=稀疏、f=形式参数、g=全局、p=持久)。

%b

打印变量占用的字节数。

%c

打印变量的类名。

%e

打印变量包含的元素。

%n

打印变量名。

%s

打印变量的维度。

%t

打印变量的类型名称。

每个命令还可以有一个对齐修饰符:

l

左对齐。

r

右对齐(默认)。

c

列对齐(仅适用于命令 %s)。

width 参数是一个正整数,指定用于打印的最小列数。不需要最大值,因为字段会根据需要自动扩展。

参数 left-minbalance 仅当列对齐修饰符与命令 %s 一起使用时才可用。balance 指定在字段宽度内将在各条目之间对齐的列号。编号从 0 开始,表示最左侧的列。left-min 指定指定平衡列左侧的最小字段宽度。

默认格式为:

"  %la:5; %ln:6; %cs:16:6:1;  %rb:12;  %lc:-1;\n"

当从函数内部以 "local" 参数调用时,该变量会在函数及其调用的任何子程序中被本地更改。退出函数时将恢复原始变量值。

另请参阅: whos

除了显示内存中有哪些变量之外,还可以判断某个给定变量是否可用。这样就可以根据变量的存在与否来改变程序的行为。下面的示例说明了这一点。

if (! exist ("meaning", "var"))
  disp ("The program has no 'meaning'");
endif
 
c = exist (name)
c = exist (name, type)

检查 name 作为变量、函数、文件、目录或类的存在性。

返回代码 c 是以下之一:

1

name 是一个变量。

2

name 是一个绝对文件名,或是 Octave 的 path 中的一个普通文件,或者是(在附加 .m 后)Octave 的 path 中的一个函数文件。

3

name 是 Octave 的 path 中的一个 .oct.mex 文件。

5

name 是一个内置函数。

7

name 是一个目录。

8

name 是一个 classdef 类。

103

name 是一个不与文件关联的函数(在命令行中输入)。

0

name 不存在。

如果提供了可选参数 type,则仅检查指定类型的符号。有效的类型有:

"var"

仅检查变量。

"builtin"

仅检查内置函数。

"dir"

仅检查目录。

"file"

仅检查文件和目录。

"class"

仅检查 classdef 类。

如果未给定类型,且名称存在多个可能的匹配,exist 将根据以下优先级列表返回一个代码:变量、内置函数、oct 文件、目录、文件、类。

如果在 Octave 的搜索路径中存在名为 name 的普通文件,exist 将返回 2。对于不在搜索路径中的其他类型文件的信息,请改用函数 file_in_pathstat 的组合。

编程注意事项:如果 name 是由有缺陷的 .oct/.mex 文件实现的,调用 exist 可能会导致 Octave 崩溃。为了保持高性能,Octave 信任 .oct/.mex 文件而不对它们进行沙箱隔离。

另请参阅: file_in_loadpathfile_in_pathdir_in_loadpathstat

通常 Octave 会管理内存,但有时手动从内存中删除变量也是实用的。当处理占用大量内存的大变量时,通常需要这样做。在使用 IEEE 754 浮点格式的计算机上,以下程序分配了一个需要约 128 MB 内存的矩阵。

large_matrix = zeros (4000, 4000);

由于将此变量保留在内存中可能会减慢其他计算的速度,因此可能有必要手动将其从内存中删除。clearclearvars 函数可以执行此操作。

 
clear
clear pattern
clear options pattern

删除与给定 pattern 匹配的名称,从而释放内存。

pattern 可以包含以下特殊字符:

?

匹配任意单个字符。

*

匹配零个或多个字符。

[ list ]

匹配由 list 指定的字符列表。如果第一个字符是 !^,则匹配除 list 中指定字符以外的所有字符。例如,模式 [a-zA-Z] 将匹配所有小写和大写字母字符。在 Windows 上,方括号按字面意义匹配,不用于对字符进行分组。

例如,命令

clear foo b*r

清除名称为 foo 以及所有以字母 b 开头并以字母 r 结尾的名称。

如果在没有任何参数的情况下调用 clear,则会从当前作用域中清除所有用户定义的变量(即局部变量)。当前作用域中存在的任何全局变量将不再可见,但它们将继续存在于全局作用域中。函数不受此形式 clear 的影响。

以下参数有长短两种形式:

all,-all,-a

从符号表中清除所有局部和全局用户定义的变量以及所有函数。

-exclusive,-x

清除匹配以下模式的变量。

functions,-functions,-f

从函数符号表中清除函数名称。除非函数已被 mlock 锁定在内存中,否则持久变量将被重新初始化为其默认值。

global,-global,-g

清除全局变量名。

variables,-variables,-v

清除局部变量名。

classes,-classes,-c

清除类结构体表和所有对象。

-regexp,-r

pattern 参数被视为正则表达式,任何匹配项都将被清除。

除了 -exclusive-regexp 之外,所有长参数也可以不带破折号使用。注意,除了 -exclusive 外,每个调用只能指定一个其他参数。所有参数必须出现在任何模式之前。

编程说明:命令 clear name 仅清除变量 name,但前提是当前已定义了一个名为 name 的变量和一个同名函数。例如,假设您定义了一个函数 foo,然后通过执行赋值 foo = 2 将其隐藏。执行一次 clear foo 将清除变量定义并恢复 foo 作为函数的定义。再次执行 clear foo 将清除函数定义。

当清除链接到全局变量的局部变量名时,仅删除该变量的本地副本。全局副本仍然存在,可以使用 global global_varname 恢复访问。相反,clear -g global_varname 将同时删除局部变量和全局变量。

另请参阅: clearvarswhowhosexistmlock

 
clearvars
clearvars pattern
clearvars -regexp pattern
clearvars … -except pattern
clearvars … -except -regexp pattern
clearvars -global …

从内存中删除与给定 pattern 匹配的变量。

pattern 可以包含以下特殊字符:

?

匹配任意单个字符。

*

匹配零个或多个字符。

[ list ]

匹配由 list 指定的字符列表。如果第一个字符是 !^,则匹配除 list 中指定字符以外的所有字符。例如,模式 [a-zA-Z] 将匹配所有小写和大写字母字符。在 Windows 上,方括号按字面意义匹配,不用于对字符进行分组。

clearvars 可以以与 clear 相同的方式使用,但接受 -except 选项,该选项允许指定应删除的变量。允许使用 -regexp-except 选项的任意组合,但 -except 必须始终位于要保留的模式之前。所有参数和模式必须出现在 -global 之后。如果使用了 -global,则只有全局变量会被清除。

另请参阅: clearwhowhosexist

在开发过程中(而非在已完成的程序中),能够检查变量名中使用了哪些字符通常很有用。以下示例说明了这一点。

isvarname ("foo")
 -|  1
 
info

在程序的开发过程中有用,在已完成的程序中则不太有用。

 
doc function_name
doc function_name operator_name

在程序中包含文档字符串的其它函数。

 
type name
type -q name
text = type ("name",…)

显示 name 的内容,它可以是文件、函数(m 文件)、变量、运算符或关键字。

type 通常会在前面加上一行描述 name 类别(如函数或变量)的标题行;-q 选项会抑制此行为。

如果未使用输出变量,则内容显示在屏幕上。否则,返回一个字符串元胞数组,其中每个元素对应于每个请求的函数的内容。

 
which name
[str,…] = which ('name',…)

显示每个 name 的类型。

如果 name 是从函数文件定义的,还会显示该文件的完整名称。

另请参阅: helplookfor

 
what
what dir
w = what (dir)

列出目录 dir 中特定于 Octave 的文件。

如果未指定 dir,则使用当前目录。

如果请求返回参数,则找到的文件在结构体 w 中返回。该结构体包含以下字段:

path

目录 dir 的完整路径

m

m 文件的元胞数组

mat

mat 文件的元胞数组

mex

mex 文件的元胞数组

oct

oct 文件的元胞数组

mdl

mdl 文件的元胞数组

slx

slx 文件的元胞数组

p

p 文件的元胞数组

classes

类目录的元胞数组(@classname/

packages

包目录的元胞数组(+pkgname/

兼容性说明:Octave 不支持 mdl、slx 和 p 文件。what 对这些类别将始终返回空列表。

另请参阅: whichlsexist


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4