2017-02-17 21 views
0

ユーザー入力を受け取り、それを暗号化する少しのコードがあります。これはハッシュ式ではなく、単純なエニグマコードです。を簡略化されたコードは次のとおりです。数式は文字列を変数としてではなく文字列としてしか見ません

def Hash (string): 
    for x in range(0, len(string)): 
     if x == 0: 
      HashC = str(ord(string[x:x+1])) 
     else: 
      HashC = HashC+str(ord(string[x:x+1])) 
      print(HashC) 
    U = HashC 

U = input("What do you want to hash? ") 
Hash(U) 
print(U) 

出力プリントとその変換で起こっていただきました私を見ます。

私はコードが「暗号化」コードに文字列を変更したいので、私は出力

> What do you want to hash? Test 
> 84101 
> 84101115 
> 84101115116 
> 84101115116 

にしたい何

> What do you want to hash? Test 
> 84101 
> 84101115 
> 84101115116 
> Test 

+0

何が問題になっています。また、あなたは文字列は不変であるとして、あなたはそのためstring

への変更をしなかったようなものの、Uにこの値を格納する必要があり、あなたのような何かをする必要がありますか?あなたは、あなたが見ているものが、あなたが見ているものとは違うとは言いませんでした。 C++スタイルの参照渡しのセマンティクス( 'str'は不変で、' Hash'の変更は 'Hash'以外の変数' U'を変更しません)を期待している問題があると思いますが、これは単なる推測ですあなたが間違っていると思うところで。 – ShadowRanger

+2

'U = HashC'ではなく' HashC'を返し、 'Hash(U)'ではなく 'U = Hash(U)'を返します。上で指摘したように、Pythonの文字列は不変です。 – vendaTrout

+0

@vendaTroutあなたは答えを作成していただきありがとうございますか?それとも、この質問を削除したいのですか? – Keithwayne

答えて

1

変数Uのスコープは、機能の外にあります。ファンクションブロックにU = HashCを割り当てると、ブロックにはUが割り当てられますが、ファンクションブロックが終了すると、Uの値はinput()に復元されます。これは、のように、Cで値が渡された場合にのみ、ここではUが明示的に渡されることなくファンクションブロックに表示されます。

def Hash (string): 
    for x in range(0, len(string)): 
    if x == 0: 
     HashC = str(ord(string[x:x+1])) 
    else: 
     HashC = HashC+str(ord(string[x:x+1])) 
     print(HashC) 
    return HashC 

U = input("What do you want to hash? ") 
U = Hash(U) 
print(U) 
+0

あなたがこれを暗示しているかどうかはわかりませんが、関数内の 'U = HashC'という行は実際には、関数内の' U'の値を外部から完全に見えなくします。その割り当てを行うと、 'U'はローカル変数になり、グローバルルックアップはまったく実行されません。代入の前に関数内でそれを参照しようとすると、 'NameError'が発生します。 –

+0

いいえ、機能はまだ 'U'を見ることができます。例えば、 'a = 1'を定義するだけです。 'def x():print(a)'です。これは '1'を出力します。あなたのコメントを正しく理解していない場合は、私を修正してください。 – vendaTrout

+0

'def x():print(a);あなたがしたように 'a = 1'をグローバルに割り当てても、a = 2はNameErrorを発生させます。関数内で 'a = 2' * anywhere *を実行すると、' a'は関数全体を通してローカル変数になります –

2

UHashはグローバル変数ではなくローカル変数です。

global Uを上に追加すると、U = HashCが問題を解決する場合があります。

グローバル変数を変更すると、副作用が発生し、しばしば何らかのバグが発生することがあります。代わりにHashCHashU = Hash(U)に戻してください。

関連する問題