在Python中优雅地增加全局变量的方法:
这是我目前的代码:
my_i = -1
def get_next_i():
global my_i
my_i += 1
return my_i
使用生成器:
my_iter = iter(range(100000000))
def get_next_i():
return next(my_iter)
具有类:
class MyI:
MyI.my_i = -1
@staticmethod
def next():
MyI.my_i += 1
return MyI.my_i
- 第一个方法比较冗长,我不认为它是一种更好的编码方式。
- 第二个方法更加优雅,但有一个上限。
- 第三个方法虽然很长,但至少没有全局变量需要处理。
那么,这些方法的最佳替代方案是什么?
这些函数的目的是为了给我的代码中的特定事件分配唯一的编号。代码不仅仅是单个循环,因此在这里使用
for i in range(...):
不合适。后续版本可能会使用多个索引分配给不同的事件。第一个代码需要重复来解决这样的问题。(get_next_i()
,get_next_j()
, ...)
谢谢。
itertools.count
吗? - jonrsharpemy_module.MyI.my_i
而不是my_module.my_i
。就担心全局变量危险的目的而言,全局变量是任何人都可以随意访问的东西。将其从模块命名空间移动到类命名空间中并不能消除全局变量的潜在问题。您需要解决潜在的问题(或同时解决)。 - Steve JessopMyI.my_i
并破坏next()
方法的功能。第一个例子很差,因为编写for my_i in range(123):
将破坏get_next_i()
函数。 - Szabolcs Dombifor my_i in range(123:)
会重新分配全局变量。但是我明白了:我不会在模块级别编写这样的代码,但那些这样做的人将遇到此问题。那些在类级别编写for my_i in xrange(123):
的人将遇到相同的问题,但我承认这更加罕见。 - Steve Jessop