如何将布尔值附加到元组?

时间:2014-02-09 18:10:36

标签: python python-3.x

我的方法是:

def build_layers():
    layers = ()
    for i in range (0, 32):
        layers += (True)

但这会导致

TypeError: can only concatenate tuple (not "bool") to tuple

上下文:这应该准备bpy.ops.pose.armature_layers的调用,因此我无法选择列表。

3 个答案:

答案 0 :(得分:5)

(True)不是元组。

请改为:

layers += (True, )

更好的是,使用发电机:

(True, ) * 32

答案 1 :(得分:1)

由于元组是不可变的,每个连接都会创建一个新的元组。最好做一些事情:

def build_layers(count):
    return tuple([True]*count)

如果你需要构造元组的逻辑,只需在元组构造函数中使用列表推导或生成器表达式:

>>> tuple(bool(ord(e)%2) for e in 'abcdefg')
(True, False, True, False, True, False, True)

答案 2 :(得分:1)

只有一个元组可以添加到元组中,所以这将是一个有效的代码

def build_layers():
    layers = ()
    for i in range (0, 32):
        layers += (True,)

然而,添加元组不是非常pythonic

def build_layers():
    layers = []
    for i in range (0, 32):
        layers.append(True)
    return tuple(layers)

如果True值依赖于i,则可以创建函数

def f(i):
    True

def build_layers():
    layers = []
    for i in range (0, 32):
        layers.append(f(i))
    return tuple(layers)

但这通常最适合生成器表达式

def build_layers():
    return tuple(f(i) for i in range(0,32))

顺便说一下范围的起始值是默认值0

所以这同样有效

def build_layers():
    return tuple(f(i) for i in range(32))