通过全局方式在Python中修改字段问题。

huangapple go评论61阅读模式
英文:

Modify field issues via global in python

问题

在执行文件 b 时,输出的 x 值取决于文件 b 的导入方式。如果按照第一种方式导入(即 from a import x),那么输出将是 10。如果按照第二种方式导入(即 import a),那么输出将是 20。

这是因为在第一种导入方式中,你只导入了变量 x,而不导入 modify_global_variable 函数,因此在执行 modify_global_variable() 时,它会引用文件 a 中的全局变量 x,这个全局变量的值一开始被设置为 10,所以输出结果是 10。

而在第二种导入方式中,你导入了整个文件 a,包括其中的函数 modify_global_variable,因此当你执行 a.modify_global_variable() 时,它会修改文件 a 中的全局变量 x 的值为 20。所以在这种情况下,输出结果是 20。

英文:

If I have two files a, b, defined in file a as follows:

x = 10 # global variable

def modify_global_variable():
  global x # Use the global keyword to declare x as the global variable
  x = 20 # to modify the value of the global variable x

The b file is defined as follows:

from a import x

modify_global_variable()
print(x)

At this time to execute the b file, then how much is the x output?
My output result is that: 10
But make the b file as follows:

import a

a.modify_global_variable()
print(a.x)

At this point, I run the b file again, and the output result is 20.
Any friend to help me to answer, this is why??
Thank you!!

答案1

得分: 2

因为:

from a import x

本质上等同于:

import a
x = a.x
del a

所以,你正在创建一个新的全局变量在执行该导入语句的模块中

原始的 a.x 变量仍然存在,而你的 modify_global_variable() 函数在两种情况下都修改了它。只是它不再是 b.x 相同的变量。

考虑以下带有字典的情况:

>>> a = {'x': 10}
>>> b['x'] = a['x']
>>> print(a, b)
{'x': 10} {'x': 10}
>>> a['x'] = 20  # 你的 modify_global_variable 做了这个
>>> print(a, b)
{'x': 20} {'x': 10}

本质上,你的模块工作方式相同(实际上,它们的命名空间就是 dict 对象,你可以使用模块内部的 globals() 获取,或者使用模块的引用,比如你 import module,然后使用 module.__dict__vars(module)

英文:

Because:

from a import x

Is essentially equivalent to:

import a
x = a.x
del a

So you are creating a new global variable in the module that executes that import statement.

The original a.x variable is still there, and your modify_global_variable() function modifies it in both cases. It's just not the same variable as b.x.

Consider the following scenario with dictionaries:

>>> a = {'x': 10}
>>> b['x'] = a['x']
>>> print(a, b)
{'x': 10} {'x': 10}
>>> a['x'] = 20 # your modify_global_variable does this
>>> print(a, b)
{'x': 20} {'x': 10}

Essentially, your modules work the same way (indeed, their namespaces are literally dict objects that you can get with globals() from within the module or, with a reference to the module, say you import module, then just module.__dict__ or vars(module).

huangapple
  • 本文由 发表于 2023年6月15日 14:14:54
  • 转载请务必保留本文链接:https://go.coder-hub.com/76479594.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定