Python全局变量:函数与类之间的共享
我正在尝试让一个叫做storage_i的全局变量可以在lvl1函数中使用。我已经能把它传递给鸟类(birdofprey)里面的其他函数,但就是无法在这个框架外面使用它。我查了一些关于函数之间使用全局变量的资料,也看到有人不推荐使用全局变量。不过,简单来说,我想把storage_i的值从所有线程中加起来。如果能不使用全局变量做到这一点,那就更好了。任何帮助都非常感谢。
代码链接: https://github.com/eWizardII/homobabel/blob/master/Experimental/demo_async_falcon.py
2 个回答
如果你想在 lvl1()
这个函数里访问 storage_i
,你可以这样写:
birdofprey.storage_i
其实 storage_i
不是一个全局变量,它是一个类的属性。
把这个替换成:
global storage_i
storage_i = i
换成这个:
birdofprey.storage_i = i
你在第75行也有个拼写错误:
storage_ii = stroage_i + storage_ii
(stroage_i
应该是 storage_i
)
这一行实际上应该是:
storage_ii = birdofprey.storage_i + storage_ii
编辑:另外,我没有仔细看,你使用的类属性(storage_i)看起来可能会有竞争条件的问题。考虑使用互斥锁来保护对这个属性的访问。我觉得你还需要等线程执行完毕后才能访问这些值。
不过我不确定全局变量(或类属性)是否真的是你想要的。我觉得你真正想要的是一个线程局部变量,这样你可以在线程完成后访问它(可以看看 Thread.join
方法)。如果我理解得没错,那就忘了我上面说的关于互斥锁的事。相反,把 storage_i 属性设置为 self.storage_i
(为每个线程创建一个单独的实例)。然后在你求和的 for
循环中,访问这个值时用 urlv.storage_i
。再次强调,确保在尝试访问每个线程的值之前,先对每个线程执行 join
。
这就是我现在能提供的帮助;也许明天早上(我这边的时间)我可以再看看。