我可以有条件地选择我赋值的变量吗?

时间:2013-07-24 13:10:20

标签: python variable-assignment ternary

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

var = value1 if( booleanCheck() ) else value2

我想知道的是,如果我可以有条件地选择将值放入类似结构的var中吗?

类似的东西:

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

在我的情况下,我特意尝试将子节点分配到二进制搜索树中的正确一侧,我知道我可以做一个正常的if块,但我试图挑战自己使用最小的空间。

4 个答案:

答案 0 :(得分:4)

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

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

不是说你应该这样做。

答案 1 :(得分: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

可以替换它,但它确实不应该

答案 2 :(得分:1)

以这种方式使用localsglobals并不是很好的形式(令人困惑,不经常使用,难以调试,可怕的性能),但可以做到:< / p>

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

我认为这里面临的真正挑战是抵制看似“花哨的”#34;或&#34;创意&#34;代码和编写其他人将立即理解的代码。更不用说你自己是否必须稍后再回来。但是要知道什么时髦的代码(如旧奶酪)看起来是值得的。

答案 3 :(得分: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)

但请注意:

  • 这些&#34;句法参考&#34;减少代码可维护性 - 因为它们更难找到 - 因此可能会扰乱代码检查工具,如pylint
  • 需要以这种方式使用变量表示尝试将范围用作dict这些变量往往是&#34;同质的&#34;在某种程度上,要求在数组操作中使用,因此应该可以组合成一个专用的容器。