分配一个空列表使其变为布尔值?

Assigning an empty list makes it bool?

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

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 = [] 在不同的行中。

为什么第一个函数坏了而第二个函数正常工作?

因此,当您执行 A = B = [] 时,这是在定义变量 AB.

引用的单个列表

您可以使用以下代码进行检查

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

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

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

在第一种情况下,AB 引用同一个列表,因此每次调用 append 时,两者都会更改。

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]
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]

因此,在您的第一次尝试中,您将尝试添加 True + "str",这将给出您的错误,但您的第二次尝试将添加 str(True) + "str",这将起作用。