【问题标题】:Assigning one of multiple values based on what exists根据存在的内容分配多个值之一
【发布时间】:2011-01-04 17:43:02
【问题描述】:

在 Perl 中,如果我想为 $myVar 分配一个值 $var1、$var2 或 $var3,根据哪个值评估为真,我将编写以下代码:

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

我正在使用 Python 和 PHP 开发单独的项目,但我还没有弄清楚如何用这两种语言简洁地编码这种情况。

用 Python 编写代码的最佳方法是什么?

用 PHP 编写代码的最佳方法是什么?

【问题讨论】:

  • 你真的不应该在 Python 中这样做。如果您需要名称存在或不存在,那么您应该使用 dict 代替。
  • 正如其他人指出的那样,Python 中变量的存在并不能很好地映射到 PHP。如果您能告诉我们更多关于“存在”的含义,您将获得更好的 Python 答案。
  • 在 perl 中,你真的应该说 $myVar = $var1 // $var2 // $var3;,假设你使用的是现代 perl。
  • 韦斯,你解释错了,可能会让你的回答者走上错误的道路。 || 测试真理,而不是存在。 Dave Hilton 上面的评论测试了定义性。
  • 谢谢你,Dave 和 daxim。我已将我的问题编辑为更正确。学习 Perl 中的“//”操作符很好。

标签: php python perl


【解决方案1】:

在Python中,相信你可以说

myVar = var1 or var2 or var3

Python 文档将x or y 描述为

如果 x 为假,则为 y,否则为 x

编辑:theatrus 提出了一个有趣的观点——我什至没有考虑到变量可能没有被定义。我找到了关于这个问题的讨论:

Python 没有特定的 测试变量是否存在的函数 已定义,因为所有变量都是 预计之前已定义 使用 - 即使最初只是分配 无对象。试图访问 以前没有的变量 定义会引发异常。

这通常被认为是不寻常的 Python不知道是否有变量 已经定义好了。但是如果你 尽管如此,在这种情况下, 你可以确保给定的 变量实际上是定义的(作为无, 如果没有别的)通过尝试 在“尝试”块内访问它,然后 应该给它分配 None 对象 引发 NameError 异常。

所以,如果你不能保证变量存在,并且你想一一检查是否存在和真实性,你可能会遇到一些乱七八糟的代码。

【讨论】:

  • 这仅在声明 var1/2/3 但可能为 False 时有效。如果未声明 var1/2/3,则会导致名称错误。
  • 如果var1存在会导致异常。
  • 您可以检查 locals()globals() 字典以查看变量是否已定义,但这并不是 Python 的处理方式。
【解决方案2】:

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

但请注意,根据您要将 $myVar 设置为的条件,这将评估为 true:

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

【讨论】:

    【解决方案3】:

    Perl 在第一次引用时“自动激活”变量(据我所知)。如果变量不存在,Python 将引发 NameError。但是,您可以执行类似的操作。

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

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

    【讨论】:

    • 关于 Perl 的术语有误。如果您不使用strict pragma,则不需要在使用前声明变量(就像 PHP 一样)。始终使用 strict 被认为是最佳实践,并在可能的最小范围内根据需要将其关闭。自生化是不同的。这意味着如果你有一个深度数据结构(例如一个4维数组),你可以简单地说$array[1][3][2][0] = 5;而不必做$array[1] = []; $array[1][3]=[]; $array[1][3][2] = []; $array[1][3][2][0] = 5;。所有中间结构都是自动激活的。
    • 感谢您的澄清! :)
    【解决方案4】:

    还有conditional expressionsconditional expressions是在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'
    

    因此,如果未设置 var1var2var3,则 myVar 将收到“默认”的后备值。否则,您将获得评估为 True 的集合中任何一个 var 的值。

    【讨论】:

      【解决方案5】:

      在 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        • 2015-11-02
        相关资源
        最近更新 更多