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