del语句是否打开内存?

Does a del statement open up memory?

我写了一个 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 语句可以按预期工作,但如果没有必要,那么为了简洁起见,我想去掉它!它对记忆的实际影响是什么?

I put it in thinking that it would prevent my memory from getting filled up by thousands of datetime objects

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

... but then I read that Python uses garbage collection, similar to Java.

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

Further, does the today variable automatically get replaced with each pass through the while loop? I know that the program works as intended with the del statement, but if it is unnecessary, then I would like to get rid of it if only for the sake of brevity! What are it's actual effects on memory?

循环的每次迭代都会创建一个新的日期时间对象。 范围内的 today 名称将重新绑定到新创建的日期时间实例。旧的日期时间实例将被删除,因为它不存在任何引用(因为一旦您将名称 today 重新绑定到另一个对象,唯一的现有引用就会丢失)。再次强调,这只是引用计数,与 gc.

无关

顺便提一下,您的程序将忙于循环并使用此 while 循环消耗整个 CPU。您应该考虑将对 time.sleep 的调用添加到循环中,以便进程大部分时间保持空闲状态。或者,更好的是,使用 cron.

定期将任务安排到 运行