通过字典(python)更改全局变量
这里是初学者的问题。我正在尝试使用字典通过函数修改全局变量。此处的示例代码:通过字典(python)更改全局变量,python,variables,dictionary,Python,Variables,Dictionary,这里是初学者的问题。我正在尝试使用字典通过函数修改全局变量。此处的示例代码: count = 0 sample = {'a' : [False, count, 20], 'b' : [False, count, 60]} d = raw_input('give dict key: ') for each in sample: if each == d: sample[each][0] = True sample[each][1]
count = 0
sample = {'a' : [False, count, 20], 'b' : [False, count, 60]}
d = raw_input('give dict key: ')
for each in sample:
if each == d:
sample[each][0] = True
sample[each][1] += sample[each][2]
print('count ' + str(count))
print(sample)
print('count ' + str(count))
结果是(毫不奇怪):
我理解结果,但我想知道是否有任何方法可以访问和更改全局变量,以便最后一行中的count
将给出60
而不是0
。(最好使用简单的方法,OOP目前是我力所不及的)
#
编辑:
谢谢你的回答!我不够精确,建议的解决方案在我的情况下不起作用。上面的语句是更大函数的一部分,还有更多变量,让我们尝试重新定义它:
countOne = 0
countTwo = 0
sample = {'a' : [False, countOne, 20, 'mouse'], 'b' : [False, countTwo, 60, 'cat']}
def someFunction():
global countOne, countTwo
while something:
if somethingElse:
if anotherThing:
d = raw_input('give dict key: ')
for each in sample:
if each == d:
sample[each][0] = True
sample[each][1] += sample[each][2]
print('count ' + str(count))
print(sample)
print('count ' + str(count))
我很抱歉造成混淆,没有想到缩短它会允许其他方法适用
对于第一个答案,它不起作用,因为在我的字典中,我有相当多的全局变量(多于上面两个),根据原始输入,应该访问和修改特定变量
对于第二个答案,它将不起作用,因为它不再是本地的。好的,一个假设。我假设你事先不知道要修改哪个变量 如果这是正确的,以下内容将满足您的要求:
count = 0
sample = {'a' : [False, 'count', 20], 'b' : [False, 'count', 60]}
d = input('give dict key: ')
print('count ' + str(count))
for each in sample:
if each == d:
sample[each][0] = True
locals()[sample[each][1]] += sample[each][2]
print(sample)
print('count ' + str(count))
收益率:
give dict key: b
count 0
{'a': [False, 'count', 20], 'b': [True, 'count', 60]}
count 60
请注意,我将每个列表中的第二个条目更改为字符串,因此在创建字典时不会对其进行解释
locals()将返回本地符号表的列表。请注意,在此上下文中,count是一个局部变量,而不是全局变量。你只是在最高的范围,所以这是一个没有区别的区别。一旦有了符号表,您就可以像任何列表一样分配给它。代码中的所有变量都是全局变量,因为没有函数,所以更改任何变量都没有问题。只要把一个赋值放到你想要的任何地方就可以了。代码的缩进看起来很奇怪。我认为“样本中的每个”行不应该缩进。对吗?另外,您的问题提到了一个函数,但代码没有定义函数?在您的代码末尾,
sample['a'][1]
是否也应该是60?我建议您学习和使用。它是关于python字典数据结构、可变和不可变数据类型、globals()
和locals()
函数的。但是,既然已经有了sample['a'][1]
,为什么还要有countOne
?你复制数据是没有正当理由的,结果是你的问题是保持同步。另外,任何时候你开始有多个需要共享状态的函数,这是一个好迹象,这些函数应该是封装状态的类的方法。如果这个假设不准确,请使用@ppflrs answer,这会简单得多。我使用了你的解决方案,只是将“locals()”改为“globals()”因为修改是在函数内部进行的(我在原始问题中没有说明)。非常感谢。
give dict key: b
count 0
{'a': [False, 'count', 20], 'b': [True, 'count', 60]}
count 60