如何在Python中的for循环中使用不同的变量

如何在Python中的for循环中使用不同的变量,python,dictionary,Python,Dictionary,我试图在for循环中使用不同名称的变量。 在我解释其他事情之前,让我说这不是我的问题。是的,我正在基于for循环的索引创建不同的变量,但是我从这一点和其他资源中了解了如何做到这一点 我不知道如何在for循环中调用不同的变量。我的意思是我想要这样的东西: # pre-defined variables object_1 = 7 object_2 = 8 object_3 = 51 # create new dictionary Things = {} # populate dictionary

我试图在for循环中使用不同名称的变量。 在我解释其他事情之前,让我说这不是我的问题。是的,我正在基于for循环的索引创建不同的变量,但是我从这一点和其他资源中了解了如何做到这一点

我不知道如何在for循环中调用不同的变量。我的意思是我想要这样的东西:

# pre-defined variables
object_1 = 7
object_2 = 8
object_3 = 51

# create new dictionary
Things = {}

# populate dictionary
for i in range(1,4):
    Things['thing_%d'%i] = object_i
所以我知道如何使用字典创建单独的新变量。我想做的是,如最后一行所示,程序用索引I object_I标识变量,用于定义Things dictionary thing_I中的元素

有没有一种方法可以做到这一点,而不必为每个变量编写单独的代码行,如下图所示

Things['thing_1'] = object_1
Things['thing_2'] = object_2
Things['thing_3'] = object_3
更新的编辑和澄清:我不能使用字典定义object_1、object_2和object_3的原因是它们实际上没有在Python脚本中定义。我必须从Salome 3D建模程序文件中调用它们,其中它们被索引为Face_1、Face_2等。我希望数组中的所有元素都不需要单独的变量,但为了做到这一点,我仍然需要从Salome调用对象。我目前在Salome Python控制台中运行了一个脚本,它的开头是这样的,这样我就可以访问Salome研究中的对象:

# Salome testing
import salome
salome.salome_init("C:\Users\Me\Study3.hdf")

import GEOM
from salome.geom import geomBuilder
geompy = geomBuilder.New(salome.myStudy)

# need to retrieve all objects from that study -----------
go = salome.myStudy.FindObjectByPath("/Geometry")
it = salome.myStudy.NewChildIterator( go )
it.InitEx(True)
while it.More():
    so = it.Value()
    it.Next()
    go = so.GetObject()
    if go:
        #print(so.GetName())
        exec( "%s = go"%so.GetName() )

您可以使用内置方法,该方法将返回一个{'object\u name':object\u value}字典,如下所示:

default_value = 0
for i in range(1,4):
    Things['thing_%d'%i] = globals().get('object_%d' % i, default_value)
>>> object_1 = 7  
>>> vars()['object_1']
7

如果变量不存在,将返回默认值,而不是引发KeyError exception,则会出现默认值。您可以循环这些变量的值:

variables = (object_1, object_2, object_3)

Things = {}
for i, value in enumerate(variables):
    Things['thing_%d' % i] = value
此时,您还可以使用字典理解:

Things = { 'thing_%d' % i: value for i, value in enumerate(variables) }

但是,以动态方式访问变量,而不首先指定它们,通常是一个坏主意,也是一个糟糕设计的标志。您应该首先更改这些变量的创建方式。

您可以使用字典而不是三个不同的变量,键为object_i,值为其值。范例-

objects = {'object_1':7,
           'object_2':8,
           'object_3':51}
object_1 = 7
object_2 = 8
object_3 = 51

# create new dictionary
Things = {}
gbl = globals()
# populate dictionary
for i in range(1,4):
    Things['thing_%d'%i] = gbl['object_%d'%i]
然后,您可以访问字典值,就像您要为您的物品列表创建键一样-

上述方法可能是更好的解决方案之一,但如果由于某种原因无法使用字典,则可以使用globals函数作为字典返回全局变量的全局名称空间,然后可以使用字符串访问变量。范例-

objects = {'object_1':7,
           'object_2':8,
           'object_3':51}
object_1 = 7
object_2 = 8
object_3 = 51

# create new dictionary
Things = {}
gbl = globals()
# populate dictionary
for i in range(1,4):
    Things['thing_%d'%i] = gbl['object_%d'%i]

您也可以这样尝试:

default_value = 0
for i in range(1,4):
    Things['thing_%d'%i] = globals().get('object_%d' % i, default_value)
>>> object_1 = 7  
>>> vars()['object_1']
7

下面是一个方法来做你想做的事情

object_1 = 7
object_2 = 8
object_3 = 51

Things = {}

for i in range(1,4):
    Things['thing_%d'%i] = globals()['object_%d'%i]

不清楚您的问题和含糊不清您链接到的问题已经解释了为什么您应该使用字典而不是单独命名的变量。当您发现自己试图以编程方式创建单独命名的变量时,这强烈表明您是。@BrenBarn我理解为什么我应该使用字典,如代码所示,我正在使用字典。我的问题是调用以前在Salome文件中创建的不同对象。请参见编辑。如何访问Salome文件并获取VAR?这与您认为它所做的不同。它正在创建与原始变量无关的名为“object_1”的新字符串。请参见我的编辑,但基本上,如果不编辑我的Salome文件,我无法更改原始变量的创建方式。