python - 在“从模块名导入变量”的情况下,可变性会改变命名空间的行为吗?
问题描述
如果我们通过实例更新类变量,那么只会为该实例创建一个新的实例变量。但是,如果类变量是可变的(比如列表),那么使用 append 通过实例对类变量进行更改会使更改在所有实例中都是全局的。
同样,在 的情况下from modulename import x
,我们知道如果x
是 int/string 则调用模块中的更改值x
仅在调用模块中可见,而不是全局可见。但是,如果x
是可变的,那么可变性对命名空间的行为有任何影响吗?例如,x
调用模块中的更改值是否会更新全局命名空间中的值?或者是其他东西?
解决方案
Python 不会在导入时复制对象。该from module import foo
语法只是将模块中的特定对象分配给您范围内的名称。此外,一个模块只加载一次,因此任何后续导入也将恢复相同的对象。
因此,如果您导入一个可变对象并对其进行更新,则此更改会反映在该对象已导入的任何地方,但是该导入发生了。请记住,这是因为导入的对象和模块对象在内存中是相同的。
例子
这是一个演示该行为的示例。
模块.py
lst = []
def print_lst():
print(lst)
主文件
from module import lst
from module import print_lst
# Print the list initially
print_lst()
# Append to the list in this scope
lst.append(1)
# Print the list from inside the module
print_lst()
# Importing the module again does not reload it
import module
# Proof that the list was not copied
print(module.lst is lst)
输出
[]
[1]
True
推荐阅读
- python - 熊猫计算总值的百分比,其中总值是每个唯一列的值
- python - 在 Python 3.8 中赋值之前获取错误局部变量 XXXX
- scala - 试图掌握 ZIO
- java - 如何从私钥字节创建 PrivateKey 对象?
- excel - Excel VBA:公式 R1C1 绝对引用变量中的多列
- c++ - 文件创建时间的 std::filesystem::last_write_time() 在哪里?
- c# - ArgumentNullException:值不能为空。(参数'source')调用 ToListAsync() 时
- javascript - 使用 React 表单通过 Axios 提交文件后出现重定向问题
- javascript - 在 JS 条件中检查空数组的方法
- apache - .htaccess Access-Control-Allow-Origin 不允许特定域