基本的Python问题:在for循环中引用原始变量?

时间:2010-08-03 14:31:52

标签: python

快速,新手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没有指针,对吧?

谢谢!

5 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

答案 2 :(得分: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]

答案 3 :(得分:0)

您可以使用globals()操作全局命名空间中的名称:

for name,value in globals().items():
    if name.startswith("name_level_"):
        globals()[name] = util.translate("iw", "en", value.encode('utf-8'))

但是,将名称存储在数组或字典中可能是个更好的主意。

答案 4 :(得分:0)

避免使用大量相关变量污染您的命名空间,将它们组合在一个字典或列表中。 e.g。

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']