2024-03-29 00:10:29 发布
网友
我知道,如果我想删除Python中列表t的第一个元素,我可以使用:
del t[0]
这是最直接的。但是:
t = t[1:]
同样有效。在我正在学习的教科书中,使用后一种方法通常被认为是不好的做法,因为它并没有删除列表的标题本身,但是
“slice操作符创建一个新列表,赋值使t引用它,但是没有一个 对作为参数传递的列表有任何影响。”
为什么这么糟?你能举出一个这样的方法会显著改变函数的例子吗?提前谢谢。
这不是个好主意有多种原因:
创建一个新列表只会使创建新列表和释放旧列表成为不必要的工作。在这两个步骤之间,使用两倍的内存(因为原始列表和新列表在赋值之前同时处于活动状态)。
如果其他内容引用同一列表,则不会更新:u = t; del t[0]同时更改u和t。但是u = t; t = t[1:]在保持u不变的情况下将新列表分配给t。
u = t; del t[0]
u = t; t = t[1:]
最后,del t[0]比更不透明的t = t[1:]更清楚其去除元素的意图。
只是一个del和slice的例子。
In [28]: u = t = [1, 2,3,4] In [30]: id(u) == id(t) # now the id is same,they point one obj Out[30]: True
如果我们使用del运算符。
In [31]: del t[0] In [32]: t Out[32]: [2, 3, 4] In [33]: u Out[33]: [2, 3, 4]
但是如果我们使用slice操作符。
In [35]: t = t[1:] In [36]: t Out[36]: [2, 3, 4] In [37]: id(t) == id(u) Out[37]: False In [39]: u Out[39]: [1, 2, 3, 4]
我们发现t和u现在指向不同的obj,所以我们处理列表t,列表u不变。
考虑一个具有两种实现的函数:
def remove_first_a(t): t = t[1:] def remove_first_b(t): del t[0]
现在,请参阅正在使用的这些函数:
> l = [1, 2, 3] > remove_first_a(l) > l [1, 2, 3] > remove_first_b(l) > l [2, 3]
第一个实现只重新分配局部变量t,这对作为参数传递的对象没有影响。第二个实现实际上改变了这个对象。第一个函数在当前的形式下是相当无用的。你可以改变它:
t
def remove_first_a(t): return t[1:] > l = [1, 2, 3] > x = remove_first_b(l) > x [2, 3]
你想要一个还是另一个,更多的取决于实际的用例。有时您希望原始的list仍然保持不变以供以后使用,有时您希望确保原始的list在所有仍有对其引用的地方都得到更改。
list
这不是个好主意有多种原因:
创建一个新列表只会使创建新列表和释放旧列表成为不必要的工作。在这两个步骤之间,使用两倍的内存(因为原始列表和新列表在赋值之前同时处于活动状态)。
如果其他内容引用同一列表,则不会更新:
u = t; del t[0]
同时更改u和t。但是u = t; t = t[1:]
在保持u不变的情况下将新列表分配给t。最后,
del t[0]
比更不透明的t = t[1:]
更清楚其去除元素的意图。只是一个del和slice的例子。
如果我们使用del运算符。
但是如果我们使用slice操作符。
我们发现t和u现在指向不同的obj,所以我们处理列表t,列表u不变。
考虑一个具有两种实现的函数:
现在,请参阅正在使用的这些函数:
第一个实现只重新分配局部变量
t
,这对作为参数传递的对象没有影响。第二个实现实际上改变了这个对象。第一个函数在当前的形式下是相当无用的。你可以改变它:你想要一个还是另一个,更多的取决于实际的用例。有时您希望原始的
list
仍然保持不变以供以后使用,有时您希望确保原始的list
在所有仍有对其引用的地方都得到更改。相关问题 更多 >
编程相关推荐