我做了很多细读,但对于我想要理解的概念我没有明确的答案。
在Python中,如果我列出一个列表,例如:
L1=['muffins', 'brownies','cookies']
然后尝试使用代码替换列表中对象的第一个指针,即“松饼”:
L1[0:1] = 'cake'
我会得到一个列表L1:
['c', 'a', 'k', 'e', 'brownies', 'cookies']
然而,如果我采用相同的列表并执行操作(现在使用字符串蛋糕中的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']
任何人都能解释为什么会这样吗? 我假设当我最初拿蛋糕而不是在“列表”中时,它会将字符串分解为单个字符,以存储为对这些字符的引用,而不是对字符串的单个引用...
但我不完全确定。
答案 0 :(得分:14)
两个要点:
因此
L1[0:1] = 'cake'
将L1
的第一个元素替换为 'cake'
的个别字符。
要用字符串'cake'
替换第一个元素,只需写:
L1[0] = 'cake'
或使用切片赋值语法:
L1[0:1] = ['cake']
答案 1 :(得分:7)
如果指定切片,则右侧被认为是列表/元组(实际上,任何可迭代的 - 但要注意产生无限数量值的生成器)。
要替换列表中的项目,请使用:
my_list[0] = "cake"
(你也可以这样做
my_list[0:1] = ["cake"]
如果你真的想使用列表切片。
以下是其他几个相关的参考: slice assignment more slice assignment
答案 2 :(得分:3)
将字符串视为存储字符的序列容器。当您尝试以这种方式进行分配时,它会将字符序列中的每个项目添加到列表中。通过首先将“cake”包装在自己的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']