2010-01-13 83 views
0

在Perl中,如果我想为$ myVar赋值$ var1,$ var2或$ var3,根据哪一个的求值为真,我会编写以下代码:根据所存在的值分配多个值中的一个

$myVar = $var1 || $var2 || $var3; 

我工作在Python和PHP单独的项目,我还没有想出如何在两种语言简洁的代码这种情况。

在Python中对此进行编码的最佳方式是什么?

在PHP中对此进行编码的最佳方式是什么?

+1

你真的不应该这样做蟒蛇。如果你需要名称存在或不存在,那么你应该使用dict来代替。 – 2010-01-13 16:57:38

+0

正如其他人指出的那样,变量在Python中的存在并不能很好地映射到PHP。如果您可以更多地告诉我们“存在”的含义,您将得到更好的Python答案。 – 2010-01-13 17:20:36

+2

在perl中,假设您使用的是现代perl,您应该真的在说'$ myVar = $ var1 // $ var2 // $ var3;'。 – dave4420 2010-01-13 17:21:33

回答

3

Perl'autovivifies'首次引用时的变量(据我所知)。如果变量不存在,Python将引发一个NameError。但是,你可以做这样的事情。

var1 = var2 = var3 = None 
# code that might change the value of three variables mentioned above 
myvar = var1 or var2 or var3 

一般来说,检查一个变量是否定义(并根据它来改变控制流)在Python中是一件坏事。你应该使用字典和键。

+1

关于Perl,你有错误的术语。如果你不使用'strict'编译指示,变量不需要在使用前声明(就像PHP一样)。始终严格使用并被视为最佳做法,并尽可能在最小范围内根据需要将其关闭。 Autovivification是不同的。这意味着如果你有一个深层次的数据结构(例如一个4维数组),你可以简单地说'$ array [1] [3] [2] [0] = 5;''而不必做'$ array [1] = []; $阵列[1] [3] = []; $ array [1] [3] [2] = []; $ array [1] [3] [2] [0] = 5;'。所有的中间结构都是自动的。 – daotoad 2010-02-02 16:33:35

+0

感谢您的澄清! :) – 2010-02-02 17:10:26

2

在Python,我相信你可以说

myVar = var1 or var2 or var3 

Python文档描述x or y作为

如果x是假的,那么y,否则x

编辑 :theatrus提出了一个有趣的观点 - 我甚至没有考虑到变量可能不是def独立非执行董事。我发现对此事的讨论:

Python没有一个特定的 功能测试一个变量是否被定义 ,因为所有的变量都 之前预期 使用已定义的 - 即使最初只是None对象分配了 。试图访问 以前未定义的变量会引发异常。

它通常被认为是不常见的 Python不知道变量 是否已被定义。但是,如果你 是仍然在这种情况下, 你可以尝试 访问它一个“尝试”块内, 为其分配确保给定 变量实际上定义(如无, 如果没有别的) 不应该引发NameError异常。

所以,如果你不能保证变量存在,并且你想一个接一个地检查存在性和真实性,你可能会遇到一些混乱的代码。

+1

这仅适用于声明了var1/2/3但可能为False的情况。如果未声明var1/2/3,则会导致名称错误。 – 2010-01-13 16:56:43

+0

如果'var1'不存在*,会导致异常。 – badp 2010-01-13 17:01:08

+0

你可以检查'locals()'和'globals()'字典来查看变量是否被定义,但所有这些都不是Python的方式。 – 2010-01-13 17:48:25

1

在PHP中,您可以使用isset()来测试变量是否已设置,而不是空值。为了实现你在找什么,你可以检查是否$var1$var2$var3设置,然后将值设置为$myVar

但是这取决于你想设置你$myVar来,这将评估的条件提防true:

$str = ''; 
var_dump(isset($str)); // TRUE 
0

也有conditional expressions在Python在Python 2.5增加:

x = true_value if condition else false_value 

我无法PHP说话。

有一点需要注意的是,试图评估一个不存在的变量总会引发错误。使用Python,你可以解决此通过捕捉将发生NameError异常,如果你这样做,并回退到默认:

>>> try: 
...  myVar = var1 or var2 or var3 
... except NameError: 
...  myVar = 'default' 
... 
>>> myVar 
'default' 

所以,如果var1var2,或var3可能是没有设置,那么myVar将收到“默认”的回退值。否则,您将获得评估为True的任何一组var的值。

1

在PHP中,你可以这样做(假设变量被设置):

$vars = array($var1, $var2, $var3); 
foreach ($vars as $var) { 
    if ($myvar = $var) { 
     break; 
    } 
} 

或者使它稍微佩尔利:):

foreach(array($var1,$var2,$var3)as$var)if($myvar=$var)break; 
相关问题