问题描述
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' 不是一个字符而是一个字符串,而后者又是一个可迭代的。
,字符串是可迭代的,因为 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]
。