类似于 python 中的字符串的可变数据类型
mutable datatype similar to string in python
我有 2 个文件,假设它们是 a.py
和 b.py
,b.py
有一个全局变量,假设是 test
(数据类型是字符串),我在 a.py
中导入 test
。现在,在运行时,a.py
中的一个函数调用了 b.py
的函数,并且该函数在 b.py
中更改了 test
的值,但此更改未显示在 a.py
因为测试是字符串数据类型并且字符串是不可变的。
我试过使用列表,它确实有效,但我对使用其中只有一个元素的列表感觉不太好。那么,是否有任何可变数据类型(类似于字符串)可以用于此目的?
test
为字符串时的代码。
b.py
test = "hello"
def changeTest():
global test
test = "hii"
a.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"
a.py
from b import test,changeTest
def callFunctionInB():
changeTest()
print(test)
callFunctionInB()
print(test)
输出:
['hello']
['hii']
我认为您的问题完全在于 b.py 的实施。在给定的情况下:
test = ["hello"]
def changeTest():
test[0] = "hii"
changeTest 函数中的变量 test 是局部定义的,而不是全局定义的。通过使用:
测试=“你好”
def changeTest():
global test
test = "hii"
您将直接更新全局变量test。
Python导入语句非常棘手,你的问题是因为导入语句使用不当。
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
a.py
中的import语句是为自己创建一个变量的副本,所以当你更新模块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
配置文件,或者更好地为您的用例创建一个 class 并包含完整的 getter 和 setter。这是最好的方法。遵循这种方法以获得干净且可维护的代码库。许多其他 SO 答案都有很好的文档。喜欢Using global variables between files?
如果你绝对必须使用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
我有 2 个文件,假设它们是 a.py
和 b.py
,b.py
有一个全局变量,假设是 test
(数据类型是字符串),我在 a.py
中导入 test
。现在,在运行时,a.py
中的一个函数调用了 b.py
的函数,并且该函数在 b.py
中更改了 test
的值,但此更改未显示在 a.py
因为测试是字符串数据类型并且字符串是不可变的。
我试过使用列表,它确实有效,但我对使用其中只有一个元素的列表感觉不太好。那么,是否有任何可变数据类型(类似于字符串)可以用于此目的?
test
为字符串时的代码。
b.py
test = "hello"
def changeTest():
global test
test = "hii"
a.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"
a.py
from b import test,changeTest
def callFunctionInB():
changeTest()
print(test)
callFunctionInB()
print(test)
输出:
['hello']
['hii']
我认为您的问题完全在于 b.py 的实施。在给定的情况下:
test = ["hello"]
def changeTest():
test[0] = "hii"
changeTest 函数中的变量 test 是局部定义的,而不是全局定义的。通过使用: 测试=“你好”
def changeTest():
global test
test = "hii"
您将直接更新全局变量test。
Python导入语句非常棘手,你的问题是因为导入语句使用不当。
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
a.py
中的import语句是为自己创建一个变量的副本,所以当你更新模块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
配置文件,或者更好地为您的用例创建一个 class 并包含完整的 getter 和 setter。这是最好的方法。遵循这种方法以获得干净且可维护的代码库。许多其他 SO 答案都有很好的文档。喜欢Using global variables between files?如果你绝对必须使用
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