这是一个有趣的问题。答案是“视情况而定”。
考虑以下代码:
"Example script showing bad things you can do with python."
import os
print('this is a good script')
with open(__file__, 'w') as fdesc:
fdesc.write('print("this is a bad script")')
import bad
尝试将以上内容保存为“/tmp/bad.py”,然后执行“cd /tmp”,最后执行“python3 bad.py”,看看会发生什么。
在我的 ubuntu 20 系统上,我看到了输出:
this is a good script
this is a bad script
同样,您的问题的答案是“视情况而定”。如果你不做任何时髦的事情,那么脚本就在内存中,你就没事了。但是 python 是一种非常动态的语言,所以有多种方法可以修改你的“脚本”并让它影响输出。
如果您不想做任何时髦的事情,那么可能需要注意的事情之一就是函数内部的导入。
下面是另一个说明这个想法的例子(保存为“/tmp/modify.py”并执行“cd /tmp”然后“python3 modify.py”运行)。下面定义的 fiddle 函数模拟您在脚本运行时修改脚本(如果需要,您可以删除 fiddle 函数,在倒数第二行放入 time.sleep(300),然后自己修改文件)。
关键是因为show 函数是在函数内部而不是在模块顶部进行导入,所以在调用函数之前不会进行导入。如果您在调用show 之前修改了脚本,那么将使用您修改后的脚本版本。
如果您在修改正在运行的脚本时看到令人惊讶或意外的行为,我建议您在函数中查找 import 语句。有时做这种事情有充分的理由,所以你会不时在人们的代码和一些库中看到它。
以下是函数内部导入如何导致奇怪效果的演示。您可以按原样尝试此操作,而不是注释掉对 fiddle 函数的调用,以查看在运行时修改脚本的效果。
"Example showing import in a function"
import time
def yell(msg):
"Yell a msg"
return f'#{msg}#'
def show(msg):
"Print a message nicely"
import modify
print(modify.yell(msg))
def fiddle():
orig = open(__file__).read()
with open(__file__, 'w') as fdesc:
modified = orig.replace('{' + 'msg' + '}', '{msg.upper()}')
fdesc.write(modified)
fiddle()
show('What do you think?')