首页 > 解决方案 > 在“从模块名导入变量”的情况下,可变性会改变命名空间的行为吗?

问题描述

如果我们通过实例更新类变量,那么只会为该实例创建一个新的实例变量。但是,如果类变量是可变的(比如列表),那么使用 append 通过实例对类变量进行更改会使更改在所有实例中都是全局的。

同样,在 的情况下from modulename import x,我们知道如果x是 int/string 则调用模块中的更改值x仅在调用模块中可见,而不是全局可见。但是,如果x是可变的,那么可变性对命名空间的行为有任何影响吗?例如,x调用模块中的更改值是否会更新全局命名空间中的值?或者是其他东西?

标签: pythonpython-3.xpython-import

解决方案


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

推荐阅读