31917


変数をリストとしてまとめ、その要素となる変数の値を変更したいです。  
(Python3.5.2)

以下コードを考えましたが想定通り機能しません。

[code]

    import sys
    
    aa = 10
    bb = 10
    cc = 10
    dd = 10
    
    attributes = [aa, bb, cc, dd]
    
    for attribute in attributes:
        print(attribute)
        attribute = attribute - 1
        print(attribute)
    
    print(attributes)
    
[/code]

が、実行したところ、for文のスコープ外では値がもとに戻ります。

[code]

    10
    9
    10
    9
    10
    9
    10
    9
    [10, 10, 10, 10]
    
[/code]

最後のprint(attributes)が返す値が[9, 9, 9, 9]となるようにしたいです。  
おそらくグローバル等変数のスコープを見直せばよいとは考えておりますが、具体的にわかりません。  
また、そもそもこの書き方が「Pythonらしい」書き方なのかどうかかもわかっておりません。  
その点も合わせてご教示いただけると助かります。


CC BY-SA 3.0
2017-01-17T14:14:53.687
31916
2017-01-17T15:16:17.150
20259
question
python python3
リストに含まれる変数の値をfor文で変更したい


`attribute`は`attributes`の要素の参照ではなくコピーになるので，`attribute`を変更してもその変更は`attributes`の要素には伝わりません．  
直接`attributes`の要素を変更してやる必要があります．  
なので，`enumerate`を使って

[code]

    for i, attribute in enumerate(attributes):
        attributes[i] = attribute-1
    
[/code]

とするか，`len`を使って

[code]

    for i in range(len(attributes)):
        attributes[i] = attributes[i]-1
    
[/code]

とすれば動くはずです．  
もしくはこの程度の小さいコードであればリスト内包表記を使って記述したほうが簡潔になります．その場合は次のように書きます．

[code]

    attributes = [attribute-1 for attribute in attributes]
    
[/code]


CC BY-SA 3.0
2017-01-17T14:37:59.917
31917
2017-01-17T15:16:17.150
2017-01-17T15:16:17.150
4548
4548
31916
answer