TypeError: 只能在 Python 中加入一个可迭代对象
TypeError: can only join an iterable in Python
Python“TypeError: can only join an iterable”发生在我们将不可迭代的值传递给str.join()
方法时,例如None
调用不返回任何内容的内置方法。要解决错误,请确保将可迭代对象传递给该join()
方法。
下面是错误如何发生的示例。
fruits = ['kiwi', 'banana', 'apple'] new_list = fruits.reverse() print(new_list) # 👉️ None # ⛔️ TypeError: can only join an iterable my_str = ','.join(new_list) # 👈️ passing None to join() print(my_str)
导致错误的原因是该reverse()
方法就地改变了原始列表并且不返回任何内容(隐式返回None
)。
join()
的结果不是调用方法(例如reverse
or sort
)或不返回任何内容(returns None
)的函数。要解决错误,我们必须确保将可迭代对象传递给str.join()
方法,例如 alist
或 a tuple
。
fruits = ['kiwi', 'banana', 'apple'] fruits.reverse() my_str = ','.join(fruits) print(my_str) # 👉️ 'apple,banana,kiwi'
我们将实际列表传递给str.join()
解决错误的方法。
join()
并确保它是一个可迭代的。如果值为None
,则最常见的None
值来源是:
- 有一个不返回任何东西的函数(
None
隐式返回)。 - 将变量显式设置为
None
. reverse
将变量分配给调用不返回任何内容(例如、sort
等)的内置函数的结果。- 具有仅在满足特定条件时才返回值的函数。
str.join方法将一个可迭代对象作为参数并返回一个字符串,该字符串是可迭代对象中字符串的串联。
如果您传递给该join()
方法的值是None
,请确保您没有使用不返回任何内容的函数的结果调用它。
# 👇️ this function returns None def get_list(): print(['kiwi', 'banana', 'apple']) my_str = ' '.join(get_list())
您可以使用return
语句从函数返回值。
def get_list(): return ['kiwi', 'banana', 'apple'] my_str = ' '.join(get_list()) print(my_str) # 👉️ "kiwi banana apple"
如果您需要在将变量加入字符串之前if
检查变量是否未存储
值,请使用语句。None
my_list = None if my_list is not None: my_str = ' '.join(my_list) print(my_str) else: # 👇️ this runs print('variable stores None')
或者,您可以提供一个空列表作为后备。
my_list = None if my_list is None: my_list = [] my_str = ','.join(my_list) print(my_str) # 👉️ ''
sort()
)可以就地改变原始对象并返回None
。确保您没有将调用一个的结果存储在变量中。
错误的另一个常见原因是具有仅在满足条件时才返回值的函数。
def get_list(a): if len(a) > 3: return a # 👇️ None my_list = get_list(['a', 'b'])
函数中的if
语句get_list
仅在传入参数的长度大于 时运行3
。
None
。要解决错误,您要么必须检查函数是否没有返回
None
,要么在不满足条件时返回默认值。
def get_list(a): if len(a) > 3: return a return [] # 👈️ return empty list if condition not met # 👇️ [] my_list = get_list(['a', 'b'])
现在,无论条件是否满足,函数都保证返回一个值。
结论
Python“TypeError: can only join an iterable”发生在我们将不可迭代的值传递给str.join()
方法时,例如None
调用不返回任何内容的内置方法。要解决错误,请确保将可迭代对象传递给该join()
方法。