基础Python问题:如何在for循环中引用原始变量?

4

快速、新手级别的Python作用域问题。我该如何确保在下面的for循环中更改原始变量?

for name in [name_level_1, name_level_2, name_level_3, name_level_4]:
     name = util.translate("iw", "en", name.encode('utf-8'))
print name_level_1

换句话说,我希望print语句打印出已更改的变量,而不是原始变量。 Python没有指针,对吗?
谢谢!

你知道你没有改变任何东西,对吧? - NullUserException
大概,OP 拥有不同编码的名称。当然,这就是问题所在——如何使更改有效。 - Wayne Werner
5个回答

3

我认为您无法完成您想做的事情。

要做类似的事情,您可以使用数组索引:

names = [name_level_1, name_level_2, name_level_3, name_level_4]
for i in range(len(names)):
     names[i] = util.translate("iw", "en", names[i].encode('utf-8'))
print names[0]

但通常情况下,您只需要使用列表推导式即可完成此类操作:

names = [name_level_1, name_level_2, name_level_3, name_level_4]
names = [util.translate("iw", "en", name.encode('utf-8')) for name in names]

0
将 name_level_1 变成一个对象:
class LevelOne(object):
   def __init__(self):
       self.x = 3

name_level_1 = LevelOne()
count = 0
for name in [name_level_1, LevelOne(), LevelOne()]:
    name.x = count

print name_level_1.x

0

Python在概念层面上使用引用和对象,而不是指针。

你想做的是将name_level_1的新值分配给循环后存在的某个名称。

因此,要么展开循环并在需要时使用每个名称,例如:

name_level_1_translated = util.translate("iw", "en", name_level_1.encode('utf-8'))
print name_level_1_translated

name_level_2_translated = util.translate("iw", "en", name_level_2.encode('utf-8'))
do_stuff(name_level_2_translated)

或者,如果你打算以相同的方式使用每个名称,只需创建一个列表并在所有地方使用它。

names = [name_level_1, name_level_2, name_level_3, name_level_4]
translated_names = [util.translate("iw", "en", name.encode('utf-8')) for name in names]
for name in translated_names:
    print name

你也可以通过索引访问它们:

print names[0]

0
您可以使用 globals() 来操作全局命名空间中的名称:
for name,value in globals().items():
    if name.startswith("name_level_"):
        globals()[name] = util.translate("iw", "en", value.encode('utf-8'))

然而,将名称存储在数组或字典中可能是一个更好的选择。


0
避免在命名空间中使用大量相关变量,将它们分组放在一个字典或列表中。例如:
NAMES = { 'level_1': 'something', 'level_2': 'something else',
    'level_3': 'whatever', 'level_4': 'and so on' }
for name in NAMES:
     NAMES[name] = util.translate("iw", "en", NAMES[name].encode('utf-8'))
print NAMES['level_1']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接