3

我知道你可以在 Python 中做这样的事情:

var = value1 if( booleanCheck() ) else value2

我想知道的是,我是否可以有条件地选择具有类似结构的值放入哪个 var?

像这样的东西:

(var1 if( booleanCheck() ) else var2) = value

就我而言,特别是我试图将一个子节点分配给二叉搜索树中的正确一侧,我知道我可以做一个正常的 if 块,但我试图挑战自己使用最小的空间。

4

4 回答 4

4

理论上你可以做这样的事情,如果两个变量都已经定义:

var1, var2 = (value, var2) if booleanCheck() else (var1, value)

不过,并不是说你应该这样做。

于 2013-07-24T13:18:00.883 回答
2

由于用例分配给二叉树的正确一侧,我假设分配目标实际上是某个树节点的属性,通常的代码是

if condition:
    node.left = value
else
    node.right = value

此代码可以替换为

setattr(node, "left" if condition else "right", value)

或者

vars(node)["left" if condition else "right"] = value

可以被这个取代,但它真的不应该

于 2013-07-24T13:57:34.250 回答
1

locals使用或以这种方式使用不是很好的形式globals(令人困惑,不经常使用,难以调试,性能糟糕),但可以做到:

varname = 'a' if some_condition else 'b'
locals()[varname] = value # or globals()
print locals()[varname] # or globals()

我认为这里真正的挑战是抵制看似“花哨”或“创造性”的代码,并编写其他人会立即理解的代码。更不用说你自己,如果你以后必须回来。但值得知道时髦的代码(如旧奶酪中的代码)是什么样的。

于 2013-07-24T13:18:11.260 回答
0

不像locals(),globals()被记录为可更新的(因为它返回__dict__当前模块的)。我经常vars() 在全局范围内使用 -在这种情况下是相同的- 以减少代码重复:

for v,ar in ('a',x),('b',y): vars()[v]=fn(ar)

对于其他一些对象(如当前类/实例),__dict__的成员也可以作为语法变量访问:

class C:
    def __init__(self,a,b):
        vars(self).update(v,locals()[v] for v in 'a','b')
        do_something(self.a)

但是,请注意:

  • 这些“语法引用”降低了代码的可维护性——因为它们更难找到——因此可能会扰乱pylint.
  • 需要以这种方式使用变量通常表示尝试将作用域用作dict此类变量在某种程度上往往是“同质的”,要求在数组操作中使用,因此可能应该组合到专用容器中反而。
于 2015-12-17T12:25:34.450 回答