3

この質問は、私の以前の質問に関連しています: 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-referenceではなくby-valueとしてインポートされるため、これは不可能であることを理解しています。これまでに 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

理想的ではありませんが、関数「changeValue」を上記のように個別に呼び出すのではなく、for ループ内から呼び出すことができれば問題ありませんが、元の「参照によって変数を渡すことはできません」に戻ります。問題。

私が求めているものを達成するためのシンプルで複雑でない Pythonic の方法が必要だと確信していますか?

4

2 に答える 2

5

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辞書の変更は機能しますが、読み取り/デバッグがほとんど不可能なコードにつながるため、強くお勧めしません)。おそらく、これの実際のユースケースを知っていれば、より良いアドバイスを提供できるかもしれません。

于 2012-09-06T15:13:32.163 に答える
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
于 2012-09-06T15:13:17.677 に答える