提问人:Sourabh 提问时间:4/2/2021 最后编辑:Sourabh 更新时间:4/2/2021 访问量:168
类似于 Python 中的字符串的可变数据类型
mutable datatype similar to string in python
问:
我有 2 个文件,让我们说它们,并且有一个全局变量,比如说(数据类型是一个字符串),我正在导入 .现在,在运行时,函数 in 调用 的函数,该函数更改了 in 的值,但此更改不会显示在 中,因为测试是字符串数据类型,并且字符串是不可变的。a.py
b.py
b.py
test
test
a.py
a.py
b.py
test
b.py
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"
您将直接更新全局变量测试。
评论
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 语句 in 正在为自身创建变量的副本,因此当您更新模块 b 的全局变量时,它对 a 中的变量没有影响。a.py
要回答您的问题,有几种可能性:
- 使用模块级导入。不要使用 .
例如:
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
使用第三个配置文件,或者更好地为您的用例创建一个具有完整 getter 和 setter 的类。这是最好的方法。请遵循此方法获取干净且可维护的代码库。许多其他 SO 答案都有很好的文档。喜欢在文件之间使用全局变量?
c.py
如果绝对必须使用 ,可以使用丑陋的更新语法。请不惜一切代价避免这种情况。以上两件事之一应该很容易实现。供您参考,执行此操作的示例代码如下:
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
评论