这个问题与我之前的问题相关:python update external passed value from inside a for loop。
来自 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";
Run Code Online (Sandbox Code Playgroud)
我知道在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
Run Code Online (Sandbox Code Playgroud)
虽然不理想,但如果我可以从 for 循环内调用函数“changeValue”,而不是像上面那样单独调用它们,那就可以了,但随后我又回到原来的“无法通过引用传递变量”问题。
我确信一定有一种简单且不太复杂的 Pythonic 方法来实现我所追求的目标?
我的问题是如何通过引用传递变量的细微变化?- 但是我仍然找不到下面说明的问题的简单解决方案:如何在for-loop中改变外部字符串变量的值?
str1 = 'before'
str2 = 'before'
for i in str1,str2:
print "%s" % (i)
i = "after"
for i in str1,str2:
print "%s" % (i)
Run Code Online (Sandbox Code Playgroud)
感谢下面的有用回复,但是他们对我的具体问题并没有真正帮助,下面的代码不太通用,但更好地反映了我的用例:
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
Run Code Online (Sandbox Code Playgroud)
您可以看到两个原始字符串变量未更新.for循环旨在检测和处理格式错误的字符串,例如"描述"的赋值.所以任何"关联"的建议都将受到赞赏.
我喜欢下面的列表理解切片分配方法的优雅,并且理想地使用该技术.