Python 可变对象连接到列表

问题描述

我有这些代码行,但我不明白为什么它会起作用。

MysqL: [Warning] Using a password on the command line interface can be insecure.
ERROR 2005 (HY000): UnkNown MysqL server host 'MysqL' (0)

人们说这是python的神奇之处,我在下面有这个链接,但我没有足够的C背景 https://github.com/python/cpython/blob/998ae1fa3fb05a790071217cf8f6ae3a928da13f/Objects/listobject.c#L977

编辑:问题是为什么这不会引发异常? string 不是一个列表,它是一个可迭代的

list_ = []
string = '12345'
for i in string:
    list_ += i
print(list_)
#Output: ['1','2','3','4','5']

解决方法

我假设你理解这部分:

for i in string:

因此我将重点放在这一点上:

list_ += i

之所以有效,是因为在 python 中没有 char 类型。在 python 中,单个字符仍然是字符串。一个字符串是“可迭代的”。一个列表可以通过一个迭代来“扩展”。

list += another_list

意思

list.extend(another_list)

例如这行不通:

list += 1

因为 1 只是一个数字,而

list += 'a'

会正常工作,因为 'a' 不是一个字符而是一个字符串,而后者又是一个可迭代的。

对此 herehere 有更好的解释。

,

字符串是可迭代的,因为 str 类/类型实现了 __iter__ 方法。通过实现 __iter__ 方法,for 循环能够迭代字符串中的所有成员。每当 for 循环要求字符串中的下一个元素时,Python 的 str 类的 iterable 就会返回它的字符串实例的下一个字符。因此,在 for 循环的上下文中,i 始终是字符串中的下一个字符。

在循环中,list_ += i 类有效,因为 Python 的 list 类/类型实现了 __iadd__ 方法。 __iadd__ 是每当 Python 遇到 += 运算符时都会调用的方法。通常,__iadd__list 操作用于将元素从一个可迭代对象添加到列表实例的末尾。由于该方法旨在组合可迭代对象,如果您的代码如下,您将收到 TypeError: 'int' object is not iterable

list_ = []
string = '12345'
for i in string:
    list_ += int(i)
print(list_)

但是,您的代码可以工作,因为回到第一个讨论点,在 Python 中,字符串是可迭代的。因此,在 Python 中这样说是完全合法的:

l=[]
s='omg'
l+=s
print(l)
# Output: ['o','m','g']

您可能认为您的案例与我上面的示例不同,因为您的案例是循环遍历字符串中的每个字符,而不是处理字符串本身。但是,Python 没有字符类型,因此有效地,每个字符 (i) 都是单字符字符串。因此,for 循环中的每个字符 i 都有自己的 __iter__ 方法,有效地允许将字符附加到 list_ 的末尾,就好像操作说: list += [i]