切片操作在python中实际返回什么

切片操作在python中实际返回什么,python,slice,Python,Slice,“所有切片操作都返回一个包含请求元素的新列表” 这来自python教程 但如果是这种情况,那么为什么这段代码的行为方式是这样的: >>> a = [11, 3, 1999] >>> a[:] = [9, 78] >>> a [9, 78] 1) 如果切片返回一个新列表,那么为什么我对新列表所做的绑定会影响原始列表。这意味着什么 但我也注意到了这一点: >>> b = [4, 5, 6] >>> b

“所有切片操作都返回一个包含请求元素的新列表” 这来自python教程

但如果是这种情况,那么为什么这段代码的行为方式是这样的:

>>> a = [11, 3, 1999]
>>> a[:] = [9, 78]
>>> a
    [9, 78]
1) 如果切片返回一个新列表,那么为什么我对新列表所做的绑定会影响原始列表。这意味着什么

但我也注意到了这一点:

>>> b = [4, 5, 6]
>>> b[:].append(5)
>>> b
[4, 5, 6]
>>> print(b)
[4, 5, 6]
2) 这表明确实返回了一个新列表。当我们切分一个列表时,到底发生了什么

请指出我的无知。提前谢谢。

你把表达和作业混淆了。获取值(读取)与设置值(写入)的处理方式不同

赋值(设置)重新使用语法指定目标。在像
a[:]=…
这样的赋值中,
a[:]
是进行赋值的目标。在表达式中使用
a[:]
会生成一个新列表

换句话说,您有两个不同的语言语句,它们故意使用相同的语法。然而,它们仍然是不同的

见:

[……]

  • 如果目标是切片:将计算引用中的主表达式。它应该产生一个可变序列对象(如列表)。指定的对象应该是相同类型的序列对象。接下来,计算下限和上限表达式,只要它们存在;默认值为零和序列的长度。边界应计算为整数。如果任意一个边界为负,则序列的长度将添加到该边界中。生成的边界被剪裁为介于零和序列长度之间(包括零和序列长度)最后,序列对象被要求用指定序列的项目替换切片。如果目标序列允许,切片的长度可能与指定序列的长度不同,从而改变目标序列的长度。
(我的粗体强调)

将其与参考文档中的表达式进行比较;在表达式中进行切片会生成一个列表。
list.\uu getitem\uuu
方法将其解释为对复制了匹配索引的新列表对象的请求。其他对象类型可以选择以不同方式解释切片对象

请注意,还有第三个操作,用于删除引用,包括切片。删除采用相同的
target_list
语法,并要求删除切片所指示的索引

这三个操作是,在引擎盖下,通过(读)、(写)和(删除)钩子方法实现的;每个操作的
参数都是
slice()
对象,但只有
\uuuu getitem\uuuuuu
需要返回任何内容。

您将表达式与赋值混淆了。获取值(读取)与设置值(写入)的处理方式不同

赋值(设置)重新使用语法指定目标。在像
a[:]=…
这样的赋值中,
a[:]
是进行赋值的目标。在表达式中使用
a[:]
会生成一个新列表

换句话说,您有两个不同的语言语句,它们故意使用相同的语法。然而,它们仍然是不同的

见:

[……]

  • 如果目标是切片:将计算引用中的主表达式。它应该产生一个可变序列对象(如列表)。指定的对象应该是相同类型的序列对象。接下来,计算下限和上限表达式,只要它们存在;默认值为零和序列的长度。边界应计算为整数。如果任意一个边界为负,则序列的长度将添加到该边界中。生成的边界被剪裁为介于零和序列长度之间(包括零和序列长度)最后,序列对象被要求用指定序列的项目替换切片。如果目标序列允许,切片的长度可能与指定序列的长度不同,从而改变目标序列的长度。
(我的粗体强调)

将其与参考文档中的表达式进行比较;在表达式中进行切片会生成一个列表。
list.\uu getitem\uuu
方法将其解释为对复制了匹配索引的新列表对象的请求。其他对象类型可以选择以不同方式解释切片对象

请注意,还有第三个操作,用于删除引用,包括切片。删除采用相同的
target_list
语法,并要求删除切片所指示的索引


这三个操作是,在引擎盖下,通过(读)、(写)和(删除)钩子方法实现的;每个操作的
参数都是一个
slice()
对象,但只有
\uuuu getitem\uuuuuu
才能返回任何内容。

对目标的赋值与在表达式中使用切片不同。对于
a[:]=[9,78]
,您实际上是在执行
a=[9,78]
。。。对于
b[:].append(5)
,您的返回值为trashed@taesu:不,你不是。您正在替换
a
中的元素。您的备选方案将创建一个新列表。当您对该列表对象有多个引用时,差异很重要。我要问的是,如果切片返回一个新列表,那么我所做的赋值不会影响原始列表。对吗?对目标的赋值与在表达式中使用切片不同。对于
a[:]=[9,78]
,您实际上是在执行
a=[9,78]
。。。对于
b[:].append(5)
,您的返回值为trashed@taesu:不,你不是。您正在替换
a
中的元素。您的备选方案将创建一个新列表。当你
assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target