Python:增加全局变量的优雅方式
Posted
技术标签:
【中文标题】Python:增加全局变量的优雅方式【英文标题】:Python: Elegant way to increment a global variable 【发布时间】:2017-01-18 08:22:26 【问题描述】:在 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
?
“第三个很长,但至少没有全局变量可以使用”——它仍然有一个全局变量,只是拼写为my_module.MyI.my_i
而不是my_module.my_i
。为了担心全局变量是危险的,全局变量是任何人都可以随意访问的东西。全局变量的任何潜在问题都不会因为您将它从模块命名空间移到类命名空间而消失。您需要解决(或同时)潜在问题。
是的,但您不会将变量命名为 MyI.my_i
并破坏 next()
方法的功能。第一个例子很糟糕,因为编写 for my_i in range(123):
会破坏 get_next_i()
函数。
@Dombi:是的,“显然”for my_i in range(123:)
在模块级别重新分配了全局。但是要点:我不会在模块级别编写这样的代码,但是这样做的人会遇到这个问题。那些在课堂上写for my_i in xrange(123):
的人会遇到与MyI.my_i
相同的问题,但我承认这种情况更罕见。
【参考方案1】:
正如其他人建议的那样,itertools.count()
是最好的选择,例如
import itertools
global_counter1 = itertools.count()
global_counter2 = itertools.count()
# etc.
然后,当您需要它时,只需拨打next
:
def some_func():
next_id = next(global_counter1)
编辑:将global_counter1.next()
(仅适用于 Python 2)更改为 next(global_counter1)
,它也适用于 Python 3。
【讨论】:
【参考方案2】:您可以创建一个具有无限循环的生成器。每次调用next(generator)
都会返回下一个值,没有限制。见What does the "yield" keyword do in Python?
def create_generator()
i=0
while True:
i+=1
yield i
generator = create_generator()
print(next(generator))
print(next(generator))
【讨论】:
或者 - 只使用itertools.count
正是这样做的? (除了可选的 start 和 step 参数...)
counts = 'i': count(), 'j': count(), 'k': count()
- 然后访问 next(counts['j'])
或 next(counts['k'])
并保持 counts
可访问...
作为答案提交以上是关于Python:增加全局变量的优雅方式的主要内容,如果未能解决你的问题,请参考以下文章