10

我做了相当多的阅读,但我对我试图理解的概念没有明确的答案。

在 Python 中,如果我取一个列表,例如:

L1=['muffins', 'brownies','cookies']

然后尝试使用以下代码替换指向列表中对象的第一个指针,即“松饼”:

L1[0:1] = 'cake'

我会得到一个列表 L1:

['c', 'a', 'k', 'e', 'brownies', 'cookies']

然而,如果我采用相同的列表并执行操作(现在使用字符串 cake 中的 4 个元素):

L1[0:4] = ['cake'] # presumably, it's now passing the string cake within a list? (it passed into the modified list shown above)

我得到了我最初想要的输出:

['cake', 'brownies', 'cookies']

谁能解释一下为什么会这样?我假设当我最初拿蛋糕时没有将它放在“列表”中,它会将字符串分解为单独的字符,以存储为对这些字符的引用,而不是对字符串的单个引用......

但我不完全确定。

4

3 回答 3

15

两个重要的点:

  1. 切片赋值在右侧接受一个迭代,并用迭代产生的对象替换切片的元素。
  2. 在 Python 中,字符串是可迭代的:对字符串进行迭代会产生其字符。

因此

L1[0:1] = 'cake'

L1的单个字符替换的第一个元素'cake'

要用字符串替换第一个元素'cake',只需编写:

L1[0] = 'cake'

或者,使用切片赋值语法:

L1[0:1] = ['cake']
于 2012-06-05T18:22:38.127 回答
7

如果您指定一个切片,则假定右侧是一个列表/元组(实际上,任何可迭代的 - 但要注意产生无限数量的值的生成器)。

要替换列表中的项目,请使用:

my_list[0] = "cake"

(你也可以这样做

my_list[0:1] = ["cake"]

如果您真的想使用列表切片。

以下是其他一些相关的参考: slice assignment 更多 slice assignment

于 2012-06-05T18:22:30.830 回答
3

将字符串视为存储字符的序列容器。当您尝试以这种方式进行分配时,它会将字符序列中的每个项目添加到列表中。通过首先将“蛋糕”包装在它自己的 1 元素列表中(我们称之为 L2),您将 L2 的每个元素添加到 L1 中——它不会递归地拆分最外层序列之外的序列容器。

L1 = ['muffins', 'brownies','cookies']
L2 = ['cake']
L1[0:1] = L2
print L1
['cake', 'brownies', 'cookies']

对于其他嵌套序列对象也是如此。尝试尝试更多嵌套的序列对象,如下所示:

L3 = [['pie', 'eclairs'], ['bacon', 'chocolate']]
L1[0:1] = L3
print L1
[['pie', 'eclairs'], ['bacon', 'chocolate'], 'brownies', 'cookies']

还值得注意的是,如果您不关心列表中的顺序/定位,您可以使用append()而不必担心您的字符串会被拆分:

L1 = ['muffins', 'brownies','cookies']
L1.append('cake')
print L1
['muffins', 'brownies', 'cookies', 'cake']
于 2012-06-05T18:56:00.997 回答