分配一个空列表使它成为bool?

时间:2018-03-08 10:21:22

标签: python types variable-assignment

到目前为止,我认为列表可以包含不同类型的元素,并且每个元素都有自己的类型信息。但是,这个例子似乎暗示了一些不同的东西:

def not_working():
    A = B = []
    for x in range(1,30):
        A.append("str")
        B.append(True)
    for a,b in zip(A,B):
        print a + str(b)

导致错误

print a + str(b)
TypeError: unsupported operand type(s) for +: 'bool' and 'str'

虽然这可以按预期工作:

def working():
    A = []
    B = []
    for x in range(1,30):
        A.append("str")
        B.append(True)
    for a,b in zip(A,B):
        print a + str(b)

请注意,唯一的区别是A = B = []A = []B = []在单独的行中。

为什么第一个功能被破坏而第二个功能按预期工作?

3 个答案:

答案 0 :(得分:3)

因此,当您执行A = B = []时,这将定义由变量AB引用的单个列表。

您可以使用以下代码检查此内容

A = B = []
A.append('a')
print(A)
print(B)

您会注意到AB都是['a']

然后发生错误,因为a变量在最终循环中可以是布尔值

答案 1 :(得分:3)

在第一种情况下,AB会引用相同的列表,因此每次调用追加时,都会更改。

a = b = []

a.append("str")
print(a, b) # ['str'] ['str']

b.append(True)
print(a, b) # ['str', True] ['str', True]

当您拨打zip功能时,您会获得列表[("str", "str"), (True, True)],而不是预期的[("str", True)]

然后尝试print True + str(True)这就是为什么你得到TypeError

在第二种情况下,列表不同:

c = []
d = []
c.append("str") 
print(c, d) # ['str'] []

d.append(True)
print(c, d) # ['str'] [True]

答案 2 :(得分:2)

std::vector::emplace_back

首次尝试时,您会尝试添加std::vector,这会产生错误,但您的第二次尝试会def not_working(): A = B = [] for x in range(1, 5): A.append("str") B.append(True) print("A:", A, "B: ", B) def working(): A = [] B = [] for x in range(1, 5): A.append("str") B.append(True) print("A:", A, "B: ", B) not_working() working() A: ['str', True, 'str', True, 'str', True, 'str', True] B: ['str', True, 'str', True, 'str', True, 'str', True] A: ['str', 'str', 'str', 'str'] B: [True, True, True, True] ,这将有效。