在 [任何以前的版本] 之前,这在 Python 中是否可行
我依稀记得这个东西很久以前就可以工作了 有没有人知道这段代码以前是否真的有效?如果自从任何更新的python版本以来不推荐使用它?
代码
# My python version is 3.8
lst = ['a', 'b', 'c', 'd']
lst[0:3] = 100
print(lst)
电流输出
TypeError: can only assign an iterable
预期产出
[100, 'd']
谢谢
回答
这在任何版本中都不起作用,因为切片分配需要一个类似序列的对象来分配。
它不起作用的原因是因为您需要将其转换为单项序列,如下所示:
lst = ['a', 'b', 'c', 'd']
lst[:3] = [100]
print(lst)
或者使用元组:
lst = ['a', 'b', 'c', 'd']
lst[:3] = 100,
print(lst)
因为lst[:3]给出了一个序列对象,你分配给它的对象也需要是一个序列对象。
这在 python 中的任何版本中都是不可能的......对于不使用单个项目序列的索引将是唯一的方法。像这样:
lst = ['a', 'b', 'c', 'd']
lst[3] = 100
print(lst)
但是对于所有 python 版本都需要切片序列。
正如所提到的文档蟒3,蟒2的文档:
正如我在Python 1.4的文档中看到的:
本文档于 1996 年发布。
所以 25 年来,这是不可能的,python 文档是在 1996 年,但实际上 python 1 是在 1994 年开始的。
所有版本文档参考都是相同的。
对于 Python 自己的内置类型,这在以前是不可能的,至少在过去 20 年甚至更长时间内是不可能的。
赋值语句
如果目标是切片:评估引用中的主要表达式。它应该产生一个可变的序列对象(例如一个列表)。分配的对象应该是相同类型的序列对象。[…]
-- Python 1.4,1996 年 10 月 25 日发布的文档。
直到当前版本的所有已发布文档中都存在相同的声明。
请注意,根据数据模型,在语义上Python 没有这样的限制。
数据模型:模拟序列和映射类型
__setslice__(self, i, j, sequence)调用以实现对 的赋值self[i:j]。序列参数可以是任何类型。返回值应该是None。对于i和j对于 的注释相同__getslice__。-- Python 1.4,1996 年 10 月 25 日发布的文档。
自定义类型,最突出的是numpy.array,可以随意解释标量的切片分配。