Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过字典(python)更改全局变量_Python_Variables_Dictionary - Fatal编程技术网

通过字典(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