2017-01-24 6 views
0

私はPythonを学ぼうとするJava、C++、Cのプログラマーです。いくつかのコードで遊んでいる間、私はこの奇妙な動作に遭遇しました。私は、静的に型付けされていない言語にはなじみがありますが、この現象に対する解決策や説明を思いつくことはできません。Python - 奇妙なリストの動作 - 1つの変数名、別の参照?

for i in range(3): 
    div(a,b,c,list) 
    #print(list) 
    list = [] 
    #print(list) 
    printABC(a,b,c) 
    theInput = input("\nselect the column: a, b or c : \n") 
    if "a" in theInput:   
     list = b + a + c 
    elif "b" in theInput: 
     list = a + b + c 
    elif "c" in theInput: 
     list = a + c + b 
    print(list); 

変数または「名前」listは、私が3つの以上のリスト(abc)にそのリストを分割しています、番号のリストです。次に、私はlistをクリアし、(a,bおよびc)の所定の組合せでそれを再充填する。

ループの最初のパスでは、listがクリアされますが、forループの2回目のパスでlist = []が全く別の別の変数を参照していて、listをクリアしていません。

なぜこのようなことが起こっているのか、誰か説明がありますか?

+5

変数に[built-ins](https://docs.python.org/3/library/functions.html)と同じ名前を付けないでください。 – miradulo

+0

@Mitchが言ったことを補完して明示するために、あなたは変数 'list'の名前をつけてみました。まあ、 'list'は実際には組み込みのクラス名です。組み込み関数の名前を変更するのは悪い習慣です。 'my_list'や' array'のようなものを試してみてください。 – blacksite

+0

はい、1つの変数(不良)名、各繰り返しで異なる参照。 –

答えて

0

コメント欄の1つが既に述べたように、組み込み関数の後に変数の名前を付けないでください。

a, b, c, = 0, 1, 2 
list_1 = [0, 1, 2] 
try: 
    for i in range(3): 
     a, b, c, = list_1[0], list_1[1], list_1[2] 
     print("a:%d, b:%d. c:%d" % (a,b,c)) 
     theInput = raw_input("\nselect the column: a, b or c : \n") 
     if theInput.find("a") > -1:   
      list_1 = [b, a, c] 
     elif theInput.find("b") > -1: 
      list_1 = [a, b, c] 
     elif theInput.find("c") > -1: 
      list_1 = [a, c, b] 
     print(list_1) 
except Exception as e: 
    print(e) 

ブロックを除いてのtry /がnessesaryはありませんが、それは私が一例として使用するコードにあった:これPythoncodeは、トリックを行う必要があります。

+1

'str.find'メソッドの代わりに' if 'a'を 'theInput'行に入れないのは間違いなく、直感的ではありませんか? – blacksite

+0

@not_a_robot、そうです、あなたが「theInput」の方が直感的であれば、私が言ったように、すでに同様のサンプルコードを用意しています。 – Alex