有没有办法从Python中删除字典中的项目?
另外,如何从字典中删除项目以返回副本(即,不修改原始文件)?
我真的不能想到为什么python需要del关键字(并且大多数语言似乎没有类似的关键字).例如,不是删除变量,而是可以分配None给它.从字典中删除时,del可以添加方法.
是否有任何理由保留delpython,或者它是Python垃圾收集前几天的遗迹?
这可能是愚蠢的,但它一直在唠叨我的脑后.
Python为我们提供了两种从对象中删除属性的内置方法,del命令字和delattr内置函数.我更喜欢delattr,因为我觉得它更明确一点:
del foo.bar
delattr(foo, "bar")
Run Code Online (Sandbox Code Playgroud)
但我想知道他们之间是否存在引擎盖下的差异.
del似乎有一些困扰我的记忆.请参阅以下内容:
In [1]: import math
In [2]: math.cos(0)
Out[2]: 1.0
In [3]: del math.cos
In [4]: math.cos(0)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-9cdcc157d079> in <module>()
----> 1 math.cos(0)
AttributeError: module 'math' has no attribute 'cos'
Run Code Online (Sandbox Code Playgroud)
精细.让我们看看如果删除整个数学包会发生什么:
In [5]: del math
In [6]: math.cos(0)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-6-9cdcc157d079> in <module>()
----> 1 math.cos(0)
NameError: name 'math' is not defined
Run Code Online (Sandbox Code Playgroud)
所以现在数学本身就像预期的那样消失了.
现在让我们再次导入数学:
In [7]: import math
In [8]: math.cos(0)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call …Run Code Online (Sandbox Code Playgroud) 有人可以解释为什么以下代码的行为方式如下:
import types
class Dummy():
def __init__(self, name):
self.name = name
def __del__(self):
print "delete",self.name
d1 = Dummy("d1")
del d1
d1 = None
print "after d1"
d2 = Dummy("d2")
def func(self):
print "func called"
d2.func = types.MethodType(func, d2)
d2.func()
del d2
d2 = None
print "after d2"
d3 = Dummy("d3")
def func(self):
print "func called"
d3.func = types.MethodType(func, d3)
d3.func()
d3.func = None
del d3
d3 = None
print "after d3"
Run Code Online (Sandbox Code Playgroud)
输出(注意d2的析构函数从不被调用)是这个(python 2.7)
delete d1
after d1
func called
after …Run Code Online (Sandbox Code Playgroud) 我创建了许多对象然后我存储在列表中.但是我想在一段时间之后删除它们,因为我创建了一个新闻并且不希望我的记忆力变高(在我的情况下,如果我不删除它,它会跳到20演出的ram).
这里有一些代码来说明我想要做的事情:
class test:
def __init__(self):
self.a = "Hello World"
def kill(self):
del self
a = test()
b = test()
c = [a,b]
print("1)Before:",a,b)
for i in c:
del i
for i in c:
i.kill()
print("2)After:",a,b)
Run Code Online (Sandbox Code Playgroud)
A和B是我的对象.C是这两个对象的列表.我试图在C中使用for循环删除它:一次使用DEL和其他时间使用函数.它似乎不起作用,因为打印继续显示对象.
我需要这个,因为我多次创建了10万个对象.我第一次创建100k对象,第二次创建100k对象但是我不需要保留之前的100k.如果我不删除它们,内存使用率非常高,非常快.
每当我处理原型脚本时,我倾向于使用它,并且:
fileCount)和在这种情况下,为了避免潜在的变量冲突,我会在完成后立即删除bugger.我知道,在生产代码中我应该避免使用1.,2.和3.,但是从原型工作到完全抛光的类是非常耗时的.有时我可能想要解决一个次优,快速的重构工作.在那种情况下,我发现保持这些del陈述很方便.我是否养成了不必要的坏习惯?是del完全可以避免的?什么时候会好的?
del在Python中调用变量.这会立即释放分配的内存还是等待垃圾收集器收集?与java一样,显式调用del对释放内存的时间没有影响.
我正在通过一个关于gulp的复数课程.John Papa正在演示如何将一个删除现有css文件的函数注入到编译新文件的例程中.
del函数的回调没有触发.del函数正在运行,文件被删除,我看不到任何错误消息.如果我手动调用回调它会执行,所以看起来函数是完整的.所以我想知道什么会导致del不想执行回调.
删除例程:
function clean(path, done) {
log('cleaning ' + path);
del(path, done); // problem call
}
Run Code Online (Sandbox Code Playgroud)
'done'函数没有触发,但如果我将代码更改为:
function clean(path, done) {
log('cleaning ' + path);
del(path);
done();
}
Run Code Online (Sandbox Code Playgroud)
当然,在继续之前,这样做会使得等到del完成之前的目的无效.
任何有关正在发生的事情的想法都将受到赞赏.
供参考(如有相关):
编译css函数:
gulp.task('styles', ['clean-styles'], function(){
log('compiling less');
return gulp
.src(config.less)
.pipe($.less())
.pipe($.autoprefixer({browsers:['last 2 versions', '> 5%']}))
.pipe(gulp.dest(config.temp));
});
Run Code Online (Sandbox Code Playgroud)
注入清洁功能:
gulp.task('clean-styles', function(done){
var files = config.temp + '/**/*.css';
clean(files, done);
});
Run Code Online (Sandbox Code Playgroud)
UPDATE
如果有其他人遇到这个,重新观看了培训视频,它正在使用del的v1.1.我查了一下,我正在使用2.x. 安装v 1.1后所有工作.
我一直认为如果一个文件在没有关闭的情况下被打开就会泄漏,但我只是验证了如果我输入以下代码行,该文件将关闭:
>>> f = open('somefile.txt')
>>> del f
Run Code Online (Sandbox Code Playgroud)
出于纯粹的好奇心,这是如何工作的?我注意到该文件不包含__del __方法.