【问题标题】:mutable datatype similar to string in python类似于 python 中的字符串的可变数据类型
【发布时间】:2021-06-28 19:53:59
【问题描述】:

我有 2 个文件,比如 a.pyb.pyb.py 有一个全局变量,比如 test(数据类型是字符串),我在 a.py 中导入 test .现在,在运行时,a.py 中的一个函数调用了b.py 的一个函数,并且该函数更改了b.pytest 的值,但是这个更改没有显示在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']

【问题讨论】:

    标签: python-3.x string import python-module mutable


    【解决方案1】:

    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 配置文件,或者更好地为您的用例创建一个具有完整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
    

    【讨论】:

    • 哇,谢谢,它成功了。我明白我所犯的错误。我目前转向建议 1。
    【解决方案2】:

    我相信您的问题仅在于 b.py 的实现。在给定的情况下:

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

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

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

    您将直接更新全局变量 test。

    【讨论】:

    • 我明白你的意思。但即使在 changeTest 中使测试成为全局之后,它也无法正常工作。为了清楚起见,我还更新了代码。
    猜你喜欢
    • 2014-08-15
    • 2010-09-21
    • 1970-01-01
    • 2016-10-09
    • 2018-11-12
    • 2017-10-16
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多