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

mutable datatype similar to string in python

提问人:Sourabh 提问时间:4/2/2021 最后编辑:Sourabh 更新时间:4/2/2021 访问量:168

问:

我有 2 个文件,让我们说它们,并且有一个全局变量,比如说(数据类型是一个字符串),我正在导入 .现在,在运行时,函数 in 调用 的函数,该函数更改了 in 的值,但此更改不会显示在 中,因为测试是字符串数据类型,并且字符串是不可变的。a.pyb.pyb.pytesttesta.pya.pyb.pytestb.pya.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']
python-3.x 字符串 进口 python模块 可变

评论


答:

0赞 itprorh66 4/2/2021 #1

我相信你的问题完全在于 b.py 的实施。在给定的:

test = ["hello"]
def changeTest():
    test[0] = "hii"

changeTest 函数中的变量 test 是本地定义的,而不是全局定义的。通过使用: 测试 = “你好”

def changeTest():
    global test
    test = "hii"

您将直接更新全局变量测试。

评论

1赞 Sourabh 4/2/2021
我明白你的意思了。但是,即使在 changeTest 中将测试设为全局测试,它也不起作用。为了清楚起见,我还更新了代码。
1赞 c0deManiac 4/2/2021 #2

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

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

  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. 使用第三个配置文件,或者更好地为您的用例创建一个具有完整 getter 和 setter 的类。这是最好的方法。请遵循此方法获取干净且可维护的代码库。许多其他 SO 答案都有很好的文档。喜欢在文件之间使用全局变量?c.py

  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

评论

0赞 Sourabh 4/2/2021
哇,谢谢,它奏效了。我明白我所犯的错误。我目前转向建议 1。