python更新外部传递的值来自for循环

时间:2012-09-05 16:52:35

标签: python reference for-loop immutability

我的问题是How do I pass a variable by reference?的轻微变化 - 但是我仍然无法找到解决下面问题的简单解决方案:如何更改外部字符串变量的值来自for-loop?

str1 = 'before'
str2 = 'before'

for i in str1,str2:
    print "%s" % (i)
    i = "after"

for i in str1,str2:
    print "%s" % (i)

感谢下面的有用回复,但是他们对我的具体问题并没有真正帮助,下面的代码不太通用,但更好地反映了我的用例:

import feedparser
d = feedparser.parse('http://feeds.feedburner.com/FrontlineAudiocastPbs?format=xml')
name = d.feed.title[:127]
description = d.feed.subtitle[:255]

strs = [name,description]
for i, s in enumerate(strs):
    try:
      strs[i] = unicode(strs[i])
    except:
      strs[i] = "Invalid unicode detected!"

for s in name,description:
  print s 

您可以看到两个原始字符串变量未更新。 for循环用于检测和处理格式错误的字符串,例如“描述”的赋值。所以任何“关联”的建议都会受到赞赏。

我喜欢下面列表理解切片分配方法的优雅,理想情况下会使用这种技术。

4 个答案:

答案 0 :(得分:5)

创建字符串列表而不是将它们作为单独的变量处理,然后您可以使用enumerate循环它们:

strs = ['before', 'before']
for i, s in enumerate(strs):
    print s
    strs[i] = "after"

print strs

答案 1 :(得分:3)

一种解决方法是以不同方式构建数据,例如使用:

d = {'str1': 'before', 'str2': 'before'}
for i in d:
    print d[i]
    d[i] = "after"

重要的是这个变量是可变的(如链接中所述)。

答案 2 :(得分:1)

strs = ['before', 'before']
strs[:] = ['after' for s in strs]

答案 3 :(得分:-1)

str1 = 'before'
str2 = 'before'

import sys
currentobject = sys.modules[__name__]

for i in 'str1', 'str2':
    setattr(currentobject, i, 'after')

for i in str1,str2:
    print "%s" % (i)