【问题标题】:Was this possible in Python before [any previous version]在 [任何以前的版本] 之前,这在 Python 中是否可行
【发布时间】:2023-03-17 11:30:02
【问题描述】:

我依稀记得这个东西很久以前就开始工作了 有人知道这段代码以前是否真的有效吗? 如果自任何较新的 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']

谢谢

【问题讨论】:

  • 一定是很久以前的事了。为什么要问?
  • 这是 numpy 语法,这就是这种事情起作用的地方(虽然不完全是 - 输出类似于 [100, 100, 100, 'd'])
  • 也许你的意思是lst[0:3] = 100,?
  • 这从不 使用纯 python 列表。也许你看到的是lst[0:3] = [100]?

标签: python list slice deprecated


【解决方案1】:

这在任何版本中都不起作用,因为切片分配需要一个类似序列的对象来分配。

它不起作用的原因是您需要将其转换为单项序列,如下所示:

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 版本都需要切片序列。

如documentation for python 3、documentation of python 2中所述:

如果目标序列允许,切片的长度可能与指定序列的长度不同,从而改变目标序列的长度。

正如我在Python 1.4 的文档中看到的:

如果目标是切片:计算引用中的主要表达式。它应该产生一个可变的序列对象(例如一个列表)。分配的对象应该是同类型的序列对象。

本文档于 1996 年发布。

所以 25 年来,这是不可能的,python docs 是在 1996 年,但实际上 python 1 是在 1994 年开始的。

所有版本的文档参考都是一样的。

【讨论】:

    【解决方案2】:

    对于 Python 自己的内置类型,这在以前是不可能的,至少在过去 20 年甚至更长的时间里是这样。

    Assignment Statements

    如果目标是切片:计算引用中的主要表达式。它应该产生一个可变的序列对象(例如一个列表)。 分配的对象应该是相同类型的序列对象。 […]

    -- Python 1.4,1996 年 10 月 25 日发布的文档。

    相同的语句出现在all published documentation 直到当前版本。


    请注意,根据数据模型,语义上Python没有这样的限制。

    Data Model: Emulating sequence and mapping types

    __setslice__(self, i, j, sequence) 调用以实现对self[i:j] 的分配。 序列参数可以是任何类型。返回值应该是None。 i 和 j 的注释与 __getslice__ 相同。

    -- Python 1.4,1996 年 10 月 25 日发布的文档。

    自定义类型,最突出的是numpy.array,可以随意解释标量的切片分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多