-3

ここに私のスクリプトがありますhttp://pastebin.com/zgRrBX0U

参考までに、これは Zed Shaw の「Learning python the hard way」の ex36 用のスクリプトです。ゼルダの伝説の最初のレベルからデザインされたテキスト ベースのアドベンチャーを作成しようとしていました。

しかし、プログラムを開始すると、問題が発生しました。メインルームで開始するように機能します。しかし、どちらの方向に行っても、エラーが発生します。「'int' オブジェクトは呼び出し可能ではありません。」検索しても、pydocs を見ても、これが何を意味するのかわかりませんでした。

4

4 に答える 4

2

roomBAandを関数として定義しroomDA、後で...それらを整数にバインドします。もちろんうまくいきません。

于 2012-04-10T22:48:51.347 に答える
2

Ignacio が言うように、129 行目と 130 行目を削除すると機能します。

Python では、「呼び出し可能」は通常関数です。このメッセージは、数値 (「int」) を関数 (「callable」) であるかのように扱っていることを意味するため、Python は何をすべきかわからず、停止します。

于 2012-04-10T22:53:08.430 に答える
1

47行目:

def roomBA(key, life, door_open, roomBA, roomDA):

ここで roomBA という名前の関数を定義しています。

129行目:

roomBA = 0

ここで、roomBA を番号 0 に変更しました。

したがって、定義した元の関数は失われます。それを呼び出すために使用する名前はもうありません。

132 行目:

roomCA(key, life, door_open, roomBA, roomDA)

ここでは、関数 roomCA を呼び出しています。特に、この関数はプレイヤーに指示を求め、対応するルーム関数を呼び出そうとします。

west と入力したので、変数 roomBA によって参照される関数を呼び出そうとしました (17 行目)。しかし、ああ、それはもはや機能ではありません。0です。したがって、エラーです。

何が起こっているかというと、関数名と変数名の間に多くの衝突があります。もちろん、roomXX はゲーム内の各部屋を表す関数です。次に、状態変数 (今のところ、roomXX とも呼ばれます) があります。これらの変数は、以前に部屋に入ったことがあるかどうかを追跡することを目的としているようです。関数と状態変数の両方に同じ名前が付けられているため、あらゆる種類の予期しないことを行っています。

上記の投稿で述べたように、129 行目と 130 行目を削除してコードを実行できます。ただし、おそらく基本をよりよく理解する必要があります。開始する場所は次のとおりです。

http://en.wikipedia.org/wiki/Scope_%28computer_science%29

于 2012-04-10T23:03:20.530 に答える
0

と言うエラー。「'int' オブジェクトは呼び出し可能ではありません。」検索しても意味がわかりませんでした。

英語だけでなく言語の基礎を知ることで、これが何を意味するのかを理解することを意図しています。

エラーは、'int'オブジェクトが呼び出し可能ではないことを示しています。呼び出しは関数 (および同様のもの) に対して行うことなので、関数 (または同様のもの) があると思っていた場所に int があります。これは、関数名を int に再バインドしたためです。

Python では、すでにお気づきのとおり、次のようになります。

  1. 関数でさえ、すべてがオブジェクトです。

  2. 型は実行時までチェックされません。

  3. 値には変数ではなく型があります (実際には名前です)。

したがって、あなたが書くことを妨げるものは何もありません:

function a(): pass
a = 1

最初の行は関数オブジェクトを作成し、それを name にバインドしますa。2 行目は、整数1を name にバインドしaます。これは古いバインディングを置き換えるため、関数の名前でaなくなりました

于 2012-04-10T23:07:17.190 に答える