我有一个函数,它接受一组变量的初始条件,并将结果放入另一个全局变量中。例如,让我们说这些变量中的两个是x和y。请注意,x和y必须是全局变量(因为在许多函数之间传递大量引用时太乱/不方便)。
x = 1
y = 2
def myFunction():
global x,y,solution
print(x)
< some code that evaluates using a while loop >
solution = <the result from many iterations of the while loop>
我想看看在x和y(以及其他变量)的初始条件发生变化时结果如何变化。为了灵活性和可扩展性,我想做这样的事情:
varSet = {'genericName0':x, 'genericName1':y} # Dict contains all variables that I wish to alter initial conditions for
R = list(range(10))
for r in R:
varSet['genericName0'] = r #This doesn't work the way I want...
myFunction()
这样的&#39;打印&#39;排在&#39; myFunction&#39;在连续的调用中输出值0,1,2,...,9。
所以基本上我问你如何将一个键映射到一个值,其中值不是标准数据类型(如int),而是对另一个值的引用?做完之后,你如何引用这个价值呢?
如果按照我的意图不可能这样做:通过更改名称(您想要设置的变量)来更改任何给定变量的值的最佳方法是什么?
我使用Python 3.4,所以更喜欢适用于Python 3的解决方案。
编辑:修复了一些小的语法问题。
EDIT2:我想也许更清楚地问我的问题是:
考虑你有两个字典,一个包含圆形对象,另一个包含水果。一个字典的成员也可以属于另一个字典(苹果是水果和圆形)。现在考虑一下你有关键的苹果&#39;在两个字典中,值是指苹果的数量。当更新一组中的苹果数量时,您希望此数字也转移到圆形对象字典下的“Apple&#39;无需亲自手动更新字典。什么是处理这个问题的最pythonic方式?
答案 0 :(得分:1)
不要使用单独的字典使x
和y
全局变量引用它们,而是使字典直接包含“x”和“y”作为键。
varSet = {'x': 1, 'y': 2}
然后,在您的代码中,只要您想引用这些参数,请使用varSet['x']
和varSet['y']
。如果要更新它们,请使用varSet['x'] = newValue
等。这样字典将始终是“最新的”,您不需要存储对任何内容的引用。
答案 1 :(得分:1)
我们将以第二次编辑中给出的水果为例:
def set_round_val(fruit_dict,round_dict):
fruit_set = set(fruit_dict)
round_set = set(round_dict)
common_set = fruit_set.intersection(round_set) # get common key
for key in common_set:
round_dict[key] = fruit_dict[key] # set modified value in round_dict
return round_dict
fruit_dict = {'apple':34,'orange':30,'mango':20}
round_dict = {'bamboo':10,'apple':34,'orange':20} # values can even be same as fruit_dict
for r in range(1,10):
fruit_set['apple'] = r
round_dict = set_round_val(fruit_dict,round_dict)
print round_dict
希望这有帮助。
答案 2 :(得分:0)
从我从@BrenBarn和@ebarr的回复中收集到的,这是解决问题的最佳方法(并直接回答EDIT2)。
创建一个封装公共变量的类:
class Count:
__init__(self,value):
self.value = value
创建该类的实例:
import Count
no_of_apples = Count.Count(1)
no_of_tennis_balls = Count.Count(5)
no_of_bananas = Count.Count(7)
使用两者中的公共变量创建字典:
round = {'tennis_ball':no_of_tennis_balls,'apple':no_of_apples}
fruit = {'banana':no_of_bananas,'apple':no_of_apples}
print(round['apple'].value) #prints 1
fruit['apple'].value = 2
print(round['apple'].value) #prints 2