【问题标题】:Sync change of variables between files python在文件python之间同步变量的变化
【发布时间】:2021-05-24 16:38:19
【问题描述】:

我想在文件之间共享一个变量。

B.py

b_var = 'start'

def change_var():
    global b_var
    b_var = 'changed'

test.py

from proj.B import change_var, b_var

print(b_var)
change_var()
print(b_var)

输出是:

start
start

我怎样才能得到输出:

start
changed

【问题讨论】:

  • this 是否回答了您的问题。
  • @Ceres 实际上没有,因为列表是可变的,所以它可以这样工作,但字符串不是......
  • @lordcommander,使用from proj import B
  • @OlvinR​​oght 不错。但是有没有办法我可以写 b_var 而不是 B.b_var 并且它仍然可以工作?
  • @lordcommander,有但没那么短。

标签: python python-packaging


【解决方案1】:

简短的回答是,只要你使用一个简单的变量,你就输了。因为当你使用时(可以是任何值):

var = value

您不要尝试更改var 先前引用的对象,而只是使var 指向不同的对象。所以指向原始对象的任何其他变量都不会受到影响。

因此,您必须在可变对象(此处为模块)或容器元素上使用属性。这样,对象本身将发生变化,并且指向该对象的所有变量都将反映变化。当然,如果在你的程序的任何一点你有一个指向属性的简单变量,这个变量不会反映变化。

这样就好了:

from proj.B import change_var   # change_var will not change: we directly import it
import B

print(B.b_var)      # but we use b_var (expected to change) through another object
change_var()
print(B.b_var)

【讨论】:

    【解决方案2】:

    因为b_var 不是变量,是对不可变字符串的引用。

    导入语句正在复制引用,当change_var() 运行时,它会创建一个新字符串并仅更改B 模块上的引用,而不是test 一个。

    【讨论】:

      【解决方案3】:

      类似于python docs的解决方案

      B.py

      b_var = 'start'
      

      mod.py

      import B
      
      def change_var():
          B.b_var = 'changed'
      

      test.py

      import B
      import mod
      print(B.b_var)
      mod.change_var()
      print(B.b_var)
      

      输出

      start
      changed
      

      【讨论】:

        猜你喜欢
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2019-05-06
        • 2020-07-05
        • 1970-01-01
        • 2014-03-07
        • 1970-01-01
        相关资源
        最近更新 更多