Python全局变量:函数与类之间的共享

0 投票
2 回答
2163 浏览
提问于 2025-04-16 08:03

我正在尝试让一个叫做storage_i的全局变量可以在lvl1函数中使用。我已经能把它传递给鸟类(birdofprey)里面的其他函数,但就是无法在这个框架外面使用它。我查了一些关于函数之间使用全局变量的资料,也看到有人不推荐使用全局变量。不过,简单来说,我想把storage_i的值从所有线程中加起来。如果能不使用全局变量做到这一点,那就更好了。任何帮助都非常感谢。

代码链接: https://github.com/eWizardII/homobabel/blob/master/Experimental/demo_async_falcon.py

2 个回答

0

如果你想在 lvl1() 这个函数里访问 storage_i,你可以这样写:

birdofprey.storage_i

其实 storage_i 不是一个全局变量,它是一个类的属性。

1

把这个替换成:

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

这就是我现在能提供的帮助;也许明天早上(我这边的时间)我可以再看看。

撰写回答