为啥 .append() 方法不适用于字符串,它们的行为不像列表?

Posted

技术标签:

【中文标题】为啥 .append() 方法不适用于字符串,它们的行为不像列表?【英文标题】:Why doesn't .append() method work on strings, don't they behave like lists?为什么 .append() 方法不适用于字符串,它们的行为不像列表? 【发布时间】:2018-02-18 20:00:03 【问题描述】:

为什么即使字符串实际上是字符常量列表,这个语句也会产生错误?

string_name = ""  
string_name.append("hello word")  

我希望它起作用的原因是因为当我们使用 for-loop 时,我们可以使用这个语句:

for i in string_name:  
    ...

我认为string_name在这里被视为列表(?)

【问题讨论】:

【参考方案1】:

这就是他们在算法和数据结构课程中教给你的内容,处理算法语言(虚幻)而不是真正的编程语言,在 Python 中,字符串是字符串,列表是列表,它们是不同的对象,您可以使用所谓的字符串连接(基本上是对字符串的加法操作)“附加”到字符串:

string_name = "hello"  
string_name = string_name + " world"
print(string_name) # => "hello world"

或简写连接:

string_name = "hello"
string_name += " world"
print(string_name) # => "hello world"

列表和字符串属于这种称为iterable 的类型。 iterables 顾名思义就是可迭代对象,这意味着您可以使用关键字 in 遍历它们,但这并不意味着它们是同一类型的对象:

for i in '123': # valid, using a string
for i in [1, 2, 3]: # valid, using a list
for i in (1, 2, 3): # valid, using a tuple
for i in 1, 2, 3: # valid, using an implicit-tuple
# all valid, all different types

我强烈建议您阅读Python Documentation 和/或阅读Python's Tutorial。

来自文档词汇表:

可迭代 一个能够一次返回一个成员的对象。可迭代对象的示例包括所有序列类型(例如 liststrtuple)和一些非序列类型例如 dict、文件对象以及您使用 __iter__()__getitem__() 方法定义的任何类的对象。可迭代对象可用于 for 循环和许多其他需要序列的地方(zip()map())。当可迭代对象作为参数传递给内置函数iter() 时,它会返回该对象的迭代器。此迭代器适用于遍历一组值。使用迭代器时,通常不需要调用iter() 或自己处理迭代器对象。 for 语句会自动为您执行此操作,创建一个临时的未命名变量以在循环期间保存迭代器。另请参见迭代器、序列和生成器。 更多关于iterables。

【讨论】:

哦,现在我明白了。所以这只是意味着这两种数据类型都是可迭代的,但它们并不相同 @PiyushKumar 没错,就像整数和浮点数(实数)一样,它们都是数字,可以通过算术运算符进行操作,但它们在语言的核心上有所不同。 += 在追加之前创建原始字符串的副本,对吗?需要 O(n) 时间。有没有办法简单地附加到现有字符串而不复制它?【参考方案2】:
Error is given when u try to append strings.So better first take list and then convert list to string.Code :

               n='qwerty'
               for i in range(1):
                   temp=[]
                   temp.append(n[-3:])
                   temp.append('t')
                   newtemp=' '
                   newtemp=temp[i]+temp[i+1]
                   print(newtemp)

输出:rtyt

【讨论】:

以上是关于为啥 .append() 方法不适用于字符串,它们的行为不像列表?的主要内容,如果未能解决你的问题,请参考以下文章

Python np.append 不适用于 numpy.ndarray 类型的字典值

为啥三元条件不适用于字符串连接

为啥 CONTAINS 方法不适用于 REPLACE

为啥`XmlDocument.LoadXml()`不适用于命名空间?

为啥 scrollTo() 方法不适用于 iframe?

为啥切换效果不适用于使用角度指令的嵌套 div