我知道如果我只想删除Python中列表t 的第一个元素,我可以使用:
del t[0]
Run Code Online (Sandbox Code Playgroud)
这和它一样简单明了.但是:
t = t[1:]
Run Code Online (Sandbox Code Playgroud)
也有效.在我从中学到的教科书中说,使用后一种方法通常被认为是不好的做法,因为它不会删除列表的头部本身但是
"切片运算符创建一个新列表,赋值使得它引用它,但这些都不会对作为参数传递的列表产生任何影响."
为什么这么糟糕?你能说出一个这样的方法会显着改变一个函数的例子吗?提前致谢.
这不是一个好主意有多种原因:
创建新列表只会使不必要的工作生成新列表并取消分配旧列表.在这两个步骤之间,使用了两倍的内存(因为原始列表和新列表在分配之前同时存在).
如果其他内容引用相同的列表,则不会更新:u = t; del t[0]更改u和t.但u = t; t = t[1:]分配新的列表牛逼而留下ü不变.
最后,del t[0]更清楚的是它的意图是去除元素而不是更不透明t = t[1:].
考虑一个具有两种实现的函数:
def remove_first_a(t):
t = t[1:]
def remove_first_b(t):
del t[0]
Run Code Online (Sandbox Code Playgroud)
现在,查看正在使用的这些函数:
> l = [1, 2, 3]
> remove_first_a(l)
> l
[1, 2, 3]
> remove_first_b(l)
> l
[2, 3]
Run Code Online (Sandbox Code Playgroud)
第一个实现仅重新分配局部变量t,这对作为参数传递的对象没有影响。第二个实现实际上改变了该对象。第一个函数就其目前的形式而言是相当无用的。你可以改变它:
def remove_first_a(t):
return t[1:]
> l = [1, 2, 3]
> x = remove_first_b(l)
> x
[2, 3]
Run Code Online (Sandbox Code Playgroud)
无论您想要其中之一,更多地取决于实际用例。有时您希望原件list仍然保持不变以供以后使用,有时您希望确保原件在仍然引用它的所有地方都得到更改。
| 归档时间: |
|
| 查看次数: |
13547 次 |
| 最近记录: |