Wolfram mathematica 带有转换的映射列表返回不同的值

Wolfram mathematica 带有转换的映射列表返回不同的值,wolfram-mathematica,Wolfram Mathematica,在Mathematica中,我试图在更复杂的表达式中使用转换,同时将表达式映射到列表上。出于某种原因,使用转换规则会产生完全不同的值,但我无法从文档中看出原因 Clear[x, values] values = {{1}, {2, Null, 3}, {4, 5, Null, 6, Null }} Out[122]= {{1}, {2, Null, 3}, {4, 5, Null, 6, Null}} Length[x] /. x -> DeleteCases[#, Null] &am

在Mathematica中,我试图在更复杂的表达式中使用转换,同时将表达式映射到列表上。出于某种原因,使用转换规则会产生完全不同的值,但我无法从文档中看出原因

Clear[x, values]

values = {{1}, {2, Null, 3}, {4, 5, Null, 6, Null }}
Out[122]= {{1}, {2, Null, 3}, {4, 5, Null, 6, Null}}

Length[x] /. x -> DeleteCases[#, Null] & /@ values
Out[123]= {0, 0, 0}

Length[DeleteCases[#, Null]] & /@ values
Out[124]= {1, 2, 3}
更新:
到目前为止,我已经能够指出,
Length[x]
是一个有效的表达式,即使未定义
x
,因为
Length[]
的参数是一个返回该表达式中组件数量的表达式。现在,我需要了解如何将计算延迟到替换了
x
之后。

您可以定义自己的长度函数,该函数只对列表(或任何内容)进行计算

(*123*)

或者更笼统一点

length[v_ /; Head[v] =!= Symbol] := Length[v]

我能够使用
Hold[]
ReleaseHold[]
阻止对表达式的早期评估

In[229]:= ReleaseHold[Hold[Length[x]] /. x -> {1, 2, 3}]
Out[229]= 3

Length[x] /. x -> {1, 2, 3}
Out[230]= 0
在最初的问题上下文中,我是如何解决它的:

ReleaseHold[Hold[Length[x]] /. x -> DeleteCases[#, Null]] & /@ values

要在评估左侧之前进行更换,可以使用
Unevaluated

Unevaluated[Length[x]] /. x -> DeleteCases[#, Null] & /@ values
阅读Robby Villegas对该头部的详细理解


专用StackExchange站点:

在某些情况下,这似乎是可行的,尽管在我的情况下,Mathematica抱怨说,因为我把它用作函数的参数,而这个表达式和另一个参数的头不匹配。谢谢你的接受。我希望在上看到你,我注意到你报名了。
Unevaluated[Length[x]] /. x -> DeleteCases[#, Null] & /@ values
{1, 2, 3}