【问题标题】:best way to update values of outer-scope variables from within a for-loop?从 for 循环中更新外部范围变量值的最佳方法?
【发布时间】:2012-09-06 15:04:40
【问题描述】:

这个问题与我之前的问题有关:python update outer passed value from within 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";

我知道在 Python 中这是不可能的,因为变量是 by-value 而不是 by-reference 导入的,这是迄今为止我在 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',这将是 OK - 而不是像上面那样单独调用它们 - 但是然后我回到原来的“不能通过引用传递变量”的问题。

我确信一定有一种简单且不那么复杂的 Python 方式来实现我所追求的目标?

【问题讨论】:

  • s1 = change(s1)change(s1) 之间的真正区别是什么?请注意,python 确实通过引用传递,只是赋值创建了一个新引用,并且某些类型(int,str,...)是不可变的,因此没有真正的方法来更改参考文献...
  • 顺便说一句:为什么你一直显示示例代码而不是你的真实代码?真正的代码总是获得有用帮助的更好方式。
  • Ned - 我之前的链接问题包含用例或“真实”代码
  • mgilson,感谢您的提示change(s1)

标签: python perl reference for-loop scope


【解决方案1】:

在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 字典有效,但非常不鼓励,因为它会导致几乎无法读取/调试的代码)。也许如果我们知道这方面的实际用例,我们或许可以提供一些更好的建议。

【讨论】:

  • 别提globals
  • @NedBatchelder -- 为什么不呢?如果用户想打断他们的腿​​,这取决于他们......(据我所知,该标准甚至允许修改 globals 而不是 locals。)
  • 我只是不明白你为什么会这样回答,“这是好方法,顺便说一句,这是坏方法,不要这样做!”
  • 因为好方法实际上并不能回答问题。问题是“我该怎么做……”,而好的“答案”是“你不这样做,但这里有其他东西可能对你有用……”这不是就我而言,这确实是一个答案。在我看来,答案是“这就是你的做法,但实际上,这样做是个坏主意。这是思考问题的更好方法......”
  • 发帖人最终会自己发现不好的方法。但现在,他们知道要避免它。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多