我有2个文件,让他们说a.py
和b.py
,b.py
有一个全局变量让说test
(数据类型为字符串),和我导入test
在a.py
。现在,在运行时,函数 ina.py
调用了 的函数b.py
,该函数更改了test
in的值,b.py
但此更改未显示 in,a.py
因为测试是字符串数据类型且字符串是不可变的。
我尝试使用该列表,它有效,但我对使用包含一个元素的列表感觉不太好。那么,是否有任何可变数据类型(类似于字符串)可以用于此目的?
test
是字符串时的代码。
b.py
test = "hello"
def changeTest():
global test
test = "hii"
一个.py
from b import test,changeTest
def callFunctionInB():
changeTest()
print(test)
callFunctionInB()
print(test)
输出:
hello
hello
测试列表时的代码。
b.py
test = ["hello"]
def changeTest():
test[0] = "hii"
一个.py
from b import test,changeTest
def callFunctionInB():
changeTest()
print(test)
callFunctionInB()
print(test)
输出:
['hello']
['hii']
Python import 语句非常棘手,您的问题是因为 import 语句的使用不当。
from ... import ...
创建导入变量的副本以供参考。要在您的 python 副本上验证这一点,请尝试运行:
### a.py
import b
from b import string_value, change_value
print(string_value)
change_value("new value")
print(string_value)
print("a.py ==> b.string_value = \t", id(b.string_value))
print("a.py ==> string_value = \t", id(string_value))
### b.py
string_value = "previous"
def change_value(given_value):
global string_value
print("b.py ==> 'global' string_value \t", id(string_value))
string_value = given_value
import 语句a.py
是为自己创建一个变量的副本,所以当你更新模块 b 的全局变量时,它对 a 中的变量没有影响。
要回答您的问题,有几种可能性:
from ... import ...
. 这方面的例子是:### a.py
import b
print(b.string_value)
b.change_value("new value")
print(b.string_value)
### b.py
string_value = "previous"
def change_value(given_value):
global string_value
string_value = given_value
使用第三个c.py
配置文件,甚至更好地为您的用例创建一个具有完整 getter 和 setter 的类。这是最好的方法。遵循这种方法以获得干净且可维护的代码库。许多其他 SO 答案对此都有很好的文档。喜欢在文件之间使用全局变量?
如果您绝对必须使用from ... import ...
,则可以使用丑陋的更新语法。请不惜一切代价避免这种情况。上述两件事之一应该很容易实现。供您参考,执行此操作的示例代码为:
### a.py
from b import string_value, change_value
print(string_value)
change_value("new value")
print(string_value)
### b.py
# Please don't use this code except for understanding purpose
import sys
string_value = "previous"
def change_value(given_value):
sys.modules['__main__'].string_value = given_value
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句