我最近开始使用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值在每次迭代时都不会更新。我怎么解决这个问题?我问这个问题是因为我编写了一个更长的程序,我需要在不同的模块之间共享需要在每次不同迭代时更新的公共值。
答案 0 :(得分:5)
以下行设置变量的值一次(例如,将a
的当前值分配给c
):
a = 2
b = 3
c = a
d = b
这并不意味着只要c
发生变化,a
就会发生变化,d
会随着b
的变化而变化{{1}}。如果您希望变量更改值,则需要明确地为它们分配新值。
答案 1 :(得分:3)
整数在Python中是不可变的。你无法改变它们。
a += 1
是a = a + 1
的语法糖,即在作业a
是不同的int
对象之后。 c is not a
了。
如果a
和c
是可变对象(例如列表),则更改a
会更改c
。 c = a
使c
和a
都引用同一个对象,即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)
c
和d
最初是与a
和b
相同的值的引用,而不是相同的内存位置。将新值分配给a
和b
后,其他两个引用都不会跟随。
Python值类似于气球,变量名称就像标签。您可以在标签(名称)和气球(值)之间绑定一个线程,并且可以将多个标签绑定到给定的气球。但是赋值意味着您将 new 气球绑定到给定标签。其他标签也没有重新绑定,它们仍然与原始气球相关联。
Python整数是不可变的;它们始终保持相同的气球。通过将a
添加到就地添加运算符(1
)来增加a += 1
仍然需要找到另一个结果为a + 1
的气球,并且a
为a
到新的整数结果。如果之前将2
绑定到代表3
的气球,则会将其替换为代表值a
的新气球,并将2
恢复为该气球。您无法将标记带到整数气球并删除3
以将其替换为{{1}}。