我知道你可以在Python中做这样的事情:
var = value1 if( booleanCheck() ) else value2
我想知道的是,如果我可以有条件地选择将值放入类似结构的var中吗?
类似的东西:
(var1 if( booleanCheck() ) else var2) = value
在我的情况下,我特意尝试将子节点分配到二进制搜索树中的正确一侧,我知道我可以做一个正常的if块,但我试图挑战自己使用最小的空间。
答案 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)
以这种方式使用locals
或globals
并不是很好的形式(令人困惑,不经常使用,难以调试,可怕的性能),但可以做到:< / 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)
但请注意:
pylint
。dict
:这些变量往往是&#34;同质的&#34;在某种程度上,要求在数组操作中使用,因此应该可以组合成一个专用的容器。