限制变量范围的正常方法是在函数中使用它们。当函数完成后,它的locals
消失。
In [71]: def foo():
...: a=1
...: b=2
...: c=[1,2,3]
...: d=np.arange(12)
...: print(locals())
...: del(a,b,c)
...: print(locals())
...:
In [72]: foo()
{'d': array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), 'c': [1, 2, 3], 'a': 1, 'b': 2}
{'d': array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])}
=================
%who_ls
返回一个列表,并且可以在 RHS 上使用,如
xx = %who_ls
然后可以迭代该列表。但请注意,这是变量名称的列表,而不是变量本身。
for x in xx:
if len(x)==1:
print(x)
# del(x) does not work
显示长度为 1 的所有名称。
=====================
简单的使用方法%reset_selective
就是给临时变量一个独特的名称,例如正则表达式可以轻松找到的前缀。例如
In [198]: temp_a, temp_b, temp_c, x, y = 1,'one string',np.arange(10), 10, [1,23]
In [199]: who_ls
Out[199]: ['np', 'temp_a', 'temp_b', 'temp_c', 'x', 'y']
In [200]: %reset_selective -f temp
In [201]: who_ls
Out[201]: ['np', 'x', 'y']
===================
下面是从名称列表中执行此删除操作的示例。请记住,我们尝试删除的实际变量与其名称之间存在差异。
创建一些变量和要删除的名称列表
In [221]: temp_a, temp_b, temp_c, x, y = 1,'one string',np.arange(10), 10, [1,23]
In [222]: dellist=['temp_a', 'temp_c','x']
拿到外壳,然后user_ns
. who_ls
使用来自的密钥self.shell.user_ns
.
In [223]: ip=get_ipython()
In [224]: user_ns=ip.user_ns
In [225]: %who_ls
Out[225]: ['dellist', 'i', 'ip', 'np', 'temp_a', 'temp_b', 'temp_c', 'user_ns', 'x', 'y']
In [226]: for i in dellist:
...: del(user_ns[i])
...:
In [227]: %who_ls
Out[227]: ['dellist', 'i', 'ip', 'np', 'temp_b', 'user_ns', 'y']
所以我们必须在user_ns
字典以便删除它们。请注意,此删除代码创建了一些变量,dellist
, i
, ip
, user_ns
.
=============
您担心多少变数?他们多大?标量、列表、numpy 数组。十几个可以用字母命名的标量不会占用太多内存。如果变量的生成存在任何模式,则将它们收集在列表或字典中可能更有意义,而不是尝试为每个变量赋予唯一的名称。
一般来说,最好使用函数来限制变量的范围,而不是使用del()
or %reset
。有时,如果处理非常大的数组,即占用一兆内存并可能产生内存错误的数组,我可能会使用del
要不就a=None
删除它们。但普通变量不需要特别注意(即使在ipython
会话会持续几天)。