分配一个空列表使其变为布尔值?
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 = []
时,这是在定义变量 A
和 B
.
引用的单个列表
您可以使用以下代码进行检查
A = B = []
A.append('a')
print(A)
print(B)
您会注意到 A
和 B
都将是 ['a']
然后出现错误,因为 a 变量在最终循环中可以是布尔值
在第一种情况下,A
和 B
引用同一个列表,因此每次调用 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"
,这将起作用。
到目前为止,我认为列表可以包含不同类型的元素,并且每个元素都有自己的类型信息。然而,这个例子似乎暗示了一些不同的东西:
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 = []
时,这是在定义变量 A
和 B
.
您可以使用以下代码进行检查
A = B = []
A.append('a')
print(A)
print(B)
您会注意到 A
和 B
都将是 ['a']
然后出现错误,因为 a 变量在最终循环中可以是布尔值
在第一种情况下,A
和 B
引用同一个列表,因此每次调用 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"
,这将起作用。