使用动态名称访问变量的值

时间:2015-03-21 00:07:08

标签: python variables dynamic

我发现了几个主题,其中讨论了在循环中动态创建单个变量是不好的做法,并且更好地使用字典。

在我的情况下,我不需要动态创建它们,我想在循环中 访问

我不想为他们使用字典 ,因为这些变量在代码中的很多地方使用,并且只在我需要的地方使用动态访问。

想法示例:

car_pos = 1; man_pos = 10
car_vel = 100; man_vel = 5

for elm in ['car', 'man']:
    elm_pos = elm + '_pos'
    elm_vel = elm + '_vel'
    # I want values of elements with such names here
    print(elm_pos, elm_vel)

# Desired output:
# (1, 100)
# (10, 5)

3 个答案:

答案 0 :(得分:2)

变量名称是关联信息的可怕方式。没有任何关联man_posman_vel的内容,只是它们都恰好以man开头。除此之外,他们是完全分开的。 Python有更好的方法将这些元素捆绑在一起。

在这种情况下,mancar应该是属性为posvel的对象。

class Thing:
    def __init__(self, pos, vel):
        self.pos = pos
        self.vel = vel

# assume that both men and cars move only in one dimension
man = Thing(10, 2)   
car = Thing(100, -5)

然后你的循环就是:

for item in [car, man]:
    print(item.pos, item.vel)

请勿按照您尝试的方式进行操作。它只会导致眼泪 - 如果不是你的眼泪,那么那些必须看你的代码的人才会流泪。

答案 1 :(得分:1)

只需使用globals()字典,使用key作为变量名称。这些键的值将是这些变量的实际值。

car_pos = 1; man_pos = 10
car_vel = 100; man_vel = 5

for elm in ['car', 'man']:
    elm_pos = elm + '_pos'
    elm_vel = elm + '_vel'

    print(globals()[elm_pos], globals()[elm_vel])

答案 2 :(得分:1)

同意所有善意的话。但是,你可以尝试命名元组去非字典路由......

from collections import namedtuple
data = namedtuple('data',('pos','vel'))
car = data(1,100)
man = data(10,5)


for elm in (car,man):
    print(elm.pos,elm.vel)