Python 从for循环中更新外部范围变量值的最佳方法?

Python 从for循环中更新外部范围变量值的最佳方法?,python,perl,reference,for-loop,scope,Python,Perl,Reference,For Loop,Scope,这个问题与我前面的问题相关: 来自Perl背景,通过引用传递变量并从子范围内更新值从来都不是问题,如下面的for循环示例所示: #!/usr/bin/perl my ($str1,$str2) = ('before','before'); print "before - str1:'$str1', str2:'$str2'\n"; foreach my $str($str1,$str2){$str = 'after'} print "after - str1:'$str1', str2:'$s

这个问题与我前面的问题相关:

来自Perl背景,通过引用传递变量并从子范围内更新值从来都不是问题,如下面的for循环示例所示:

#!/usr/bin/perl
my ($str1,$str2) = ('before','before');
print "before - str1:'$str1', str2:'$str2'\n";

foreach my $str($str1,$str2){$str = 'after'}
print "after - str1:'$str1', str2:'$str2'\n";
我理解在Python中这是不可能的,因为变量是通过值而不是引用导入的,到目前为止,我在Python中找到的唯一一个完全满足我需要的解决方案是:

def changeValue(str):
  return 'after'

str1 = 'before'
str2 = 'before'
for s in str1,str2: print s

str1 = changeValue(str1)
str2 = changeValue(str2)
for s in str1,str2: print s
虽然不理想,但如果我可以在for循环中调用函数“changeValue”,而不是像上面那样单独调用它们,这将是可以的,但是我回到了最初的“无法通过引用传递变量”问题


我确信一定有一种简单且不太复杂的python方法来实现我的目标?

解决方法是停止使用自变量,而是将它们存储在字典中。例如:

def changeValue(str):
  return 'after'

data = {
    'str1': 'before',
    'str2': 'before',
}

for k, v in data.iteritems():
    print k, v

# as you had it:
data['str1'] = changeValue(str1)
data['str2'] = changeValue(str2)

# with a loop:
for key in ['str1', 'str2']:
    data[key] = changeValue(data[key])

# or a nicer way:
for k, v in data.iteritems():
    data[k] = changeValue(v)

for k, v in data.iteritems():
    print k, v

在python中,这样做的方法几乎肯定是使用字典来存储数据:

d = {'s1':'before','s2':'before'}

for k in d.keys():
    print d[k]

for k in d.keys():
    d[k] = 'after'
    print d[k]

还有其他解决方案(修改
globals
字典是可行的,但非常不鼓励这样做,因为这样会导致几乎不可能读取/调试的代码)。如果我们知道这方面的实际使用情况,我们也许能够提供一些更好的建议。

s1=change(s1)
change(s1)
之间的真正区别是什么?请注意,python确实是通过引用传递的,只是赋值创建了一个新的引用,并且某些类型(int、str,…)是不可变的,因此没有真正的方法来更改引用引用引用的对象……顺便问一下:为什么一直显示示例代码而不是实际代码?真正的代码总是获得有用帮助的更好方式。Ned-我之前的链接问题包含用例或“真正的”代码Gilson,感谢您提供的提示
change(s1)
甚至不要提及
globals
@nedbatcheld-为什么不呢?如果用户想射出他们的腿,这取决于他们。。。(据我所知,该标准甚至允许修改
全局
,而不是
本地
)我只是不明白为什么你会回答“这是做这件事的好方法,顺便说一句,这是坏方法,不要做这件事!”因为好方法实际上并不能回答问题。问题是“我该怎么做…”而好的“答案”是“你不需要,但这里有一些可能对你有用的东西…”就我而言,这并不是一个真正的答案。在我看来,答案是“这是你怎么做的,但实际上,这样做是个坏主意。这是一个更好的思考问题的方法……”海报最终会自己发现坏方法。但现在,他们知道要避免它。