【问题标题】:Access to value of variable with dynamic name访问具有动态名称的变量的值
【发布时间】:2015-05-24 12:30:42
【问题描述】:

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

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

我不想为它们使用字典,因为这些变量在代码中的很多地方都使用过,并且只有在一个地方我需要这种动态访问.

创意示例:

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)

【问题讨论】:

    标签: python variables dynamic


    【解决方案1】:

    变量名称是关联信息的一种糟糕方式。没有任何东西可以链接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)
    

    不要按照你想要的方式去做。它只会让人流泪——如果不是你的,那么那些必须查看你的代码的人也会流泪。

    【讨论】:

    • 那个例子只是为了展示想法,实际代码情况要复杂得多。另外,我现在正在研究python,想知道这样的想法能不能实现。
    • 如果情况更复杂,那么这是一个更好的理由不这样做。而且当然你可以做到,但是看在 Guido 的份上,不要这样做!
    • 如果我有很多代码已经定义了这些变量并且以非最佳方式工作并且我需要在我的代码段中接收它们的值而不对所有代码进行全局重构怎么办?跨度>
    • 那么你应该全局重构所有代码,这样它就不会让婴儿 Guido 哭泣。你已经犯错的事实不是犯更多错误的借口。查找“技术债务”的概念。
    • 我应该补充一点:您发现自己犯了错误的过程有一个名称,在继续进行之前您确实应该纠正这些错误。它被称为“编程”。
    【解决方案2】:

    只需使用 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])
    

    【讨论】:

      【解决方案3】:

      同意所有所说的。但是,您可以尝试命名元组走非字典路线...

      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)
      

      【讨论】:

      • 似乎人或车的位置或速度可能会发生变化,因此我排除了namedtuple
      • @kindall 是的,这是有道理的。我没有考虑到这一点。
      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多