del语句是否会打开内存?

时间:2018-01-07 17:33:37

标签: python del

我写了一个python脚本,在我晚上睡觉时备份我的文件。该程序设计为在计算机打开时运行,并在备份完成后自动关闭计算机。我的代码如下所示:

from datetime import datetime
from os import system
from backup import backup

while True:
    today = datetime.now()

    # Perform backups on Monday at 3:00am.
    if today.weekday() == 0 and today.hour == 3:
        print('Starting backups...')

        # Perform backups.
        backup("C:\\Users\\Jeff Moorhead\\Desktop", "E:\\")
        backup("C:\\Users\\Jeff Moorhead\\Desktop", "F:\\")
        backup("C:\\Users\\Jeff Moorhead\\OneDrive\\Documents", "E:\\")
        backup("C:\\Users\\Jeff Moorhead\\OneDrive\\Documents", "F:\\")

        # Shutdown computer after backups finish.
        system('shutdown /s /t 10')
        break

    else:
        del today
        continue

备份功能来自我编写的另一个文件,用于逐个案例地执行更多自定义备份。这段代码完全正常,但我想知道del语句

del today

确实是必要的。我认为它会阻止我的内存被数千个日期时间对象填满,但后来我读到Python使用垃圾收集,类似于Java。此外,today变量是否会在每次通过while循环时自动替换?我知道该程序与del语句一样正常工作,但如果没有必要,那么我想摆脱它只是为了简洁起见!它对记忆的实际影响是什么?

1 个答案:

答案 0 :(得分:4)

  

我认为它会阻止我的记忆被数以千计的日期时间对象填满

del语句不是必需的,您可以简单地删除该块。 Python将自动从这些局部变量中释放空间。

  

...但后来我读到Python使用垃圾收集,类似于Java。

上述陈述是错误的:这与垃圾收集器无关,垃圾收集器存在以分解循环引用。在CPython中,当对象引用计数减少到零时释放内存,即使禁用了垃圾收集器也会发生这种情况。

  

此外,今日变量是否会在每次通过while循环时自动替换?我知道该程序与del语句一样正常工作,但如果没有必要,那么我想摆脱它只是为了简洁起见!它对记忆的实际影响是什么?

在循环的每次迭代中创建一个新的datetime对象。 范围中的today名称将反弹到新创建的日期时间实例。旧的datetime实例将被删除,因为它上面没有引用(因为一旦将名称today反弹到另一个对象,唯一的现有引用就会丢失。我再次强调,这只是重新计算,与gc无关。

在一个不相关的注释中,您的程序将忙于循环并使用此while循环消耗整个CPU。您应该考虑在循环中添加对time.sleep的调用,以使进程保持大部分空闲状态。或者,更好的是,使用cron安排任务定期运行。