类似于 python 中的字符串的可变数据类型

mutable datatype similar to string in python

我有 2 个文件,假设它们是 a.pyb.pyb.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中的变量没有影响。

要回答您的问题,有两种可能性:

  1. 使用模块级导入。不要使用 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
  1. 使用第三个 c.py 配置文件,或者更好地为您的用例创建一个 class 并包含完整的 getter 和 setter。这是最好的方法。遵循这种方法以获得干净且可维护的代码库。许多其他 SO 答案都有很好的文档。喜欢Using global variables between files?

  2. 如果你绝对必须使用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