如何在Python中的模块之间共享变量

时间:2013-12-09 14:41:30

标签: python python-2.7 python-3.x

我最近开始使用Python而不是Matlab,我有一个问题,答案可能很明显,但我还不知道。

我在python中有以下模块名为shared_variables.py:

global a 
global b 

a = 2 
b = 3 
c = a
d = b

在我的main.py脚本中,我做了以下事情:

import shared_variables

for i in range(1,4):
     shared_variables.a += 1
     shared_variables.b += 1
     print 'a= ',shared_variables.a
     print 'b= ',shared_variables.b
     print 'c= ',shared_variables.c
     print 'd= ',shared_variables.d

,输出如下:

 a=  3
 b=  4
 c=  2
 d=  3
 a=  4
 b=  5
 c=  2
 d=  3
 a=  5
 b=  6
 c=  2
 d=  3

基本上c和d值在每次迭代时都不会更新。我怎么解决这个问题?我问这个问题是因为我编写了一个更长的程序,我需要在不同的模块之间共享需要在每次不同迭代时更新的公共值。

3 个答案:

答案 0 :(得分:5)

以下行设置变量的值一次(例如,将a的当前值分配给c):

a = 2 
b = 3 
c = a
d = b

这并不意味着只要c发生变化,a就会发生变化,d会随着b的变化而变化{{1}}。如果您希望变量更改值,则需要明确地为它们分配新值。

答案 1 :(得分:3)

整数在Python中是不可变的。你无法改变它们。

a += 1a = a + 1的语法糖,即在作业a是不同的int对象之后。 c is not a了。

如果ac是可变对象(例如列表),则更改a会更改cc = a使ca都引用同一个对象,即c is a

例如,

a = [0]
c = a
a[0] += 1 
print(a, c) # -> [1] [1]

以下是nice pictures to understand the relation between names and objects in Python

答案 2 :(得分:2)

cd最初是与ab相同的的引用,而不是相同的内存位置。将新值分配给ab后,其他两个引用都不会跟随。

Python值类似于气球,变量名称就像标签。您可以在标签(名称)和气球(值)之间绑定一个线程,并且可以将多个标签绑定到给定的气球。但是赋值意味着您将 new 气球绑定到给定标签。其他标签也没有重新绑定,它们仍然与原始气球相关联。

Python整数是不可变的;它们始终保持相同的气球。通过将a添加到就地添加运算符(1)来增加a += 1仍然需要找到另一个结果为a + 1的气球,并且aa到新的整数结果。如果之前将2绑定到代表3的气球,则会将其替换为代表值a的新气球,并将2恢复为该气球。您无法将标记带到整数气球并删除3以将其替换为{{1}}。