2016-12-09 10 views
2

私はPythonプログラムに取り組んでいると著者はstrは機能とshouldnに内蔵されているにもかかわらず、これが動作しているようです。この再定義パイソン組み込み関数

def blah(): 
    str = "asdf asdf asdf" 
    doStuff(str) 

のように見える機能を書いています変数として使用することはできません。

ここで実際に何が起こっていますか?私の推測は、strはもはや関数として使用できなくなりますが、彼が書いたblah()関数の範囲内でのみ使用できます。あれは正しいですか?これにより、strがグローバルに再定義されることはありません。あなたのケースでは

+4

はい、 'str'はローカルでのみ再定義されます。これはおそらく大きな問題ではないでしょうし、 'max'や' str'のような名前でこのような例が頻繁に見られます。あなたの関数には2行のコードしかない場合は、これ以上の睡眠を失うことはありません。 –

+1

関連:http://stackoverflow.com/q/41029289/2988730 –

答えて

2

内部的には、関数のローカル変数テーブルには、その機能にローカルになるstrのエントリが含まれますn。 Py3ではbuiltin.str、Py2では__builtin__.strを実行することで、関数内の組み込みクラスにアクセスできます。関数外のコードは関数のローカル変数を見ないので、組み込みクラスは他の場所でも安全に使用できます。

ここに別の警告/コーナーケースがあります。詳細はthis questionに記載されています。

def blah(): 
    x = str(12) 
    str = "asdf asdf asdf" 
    doStuff(str) 

UnboundLocalErrorで失敗します:あなたは、あなたがそれに"asdf asdf asdf"を割り当てる前であっても機能にstrのグローバル定義を使用することができませんでしたので、地元のテーブルエントリは、コンパイル時ではなく、実行時に作成されます。

-2

strだけの変数と何がその関数外str()の通常使用できないようにです:

>>> str = 'Hello world!' 
>>> print str 
Hello world! 
str(str) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'str' object is not callable 

編集:ここでは

が簡単なデモです:

def salut(): 
    str = 'Hello world!' 
    return str 
if __name__ == '__main__': 
    s = salut() 
    print str(s) #nothing prevents you from using 'str' outside 'salut()' 
+1

_ "str()関数の通常の使用を妨げるものはありません" _ - これは完全ではありません。 juanpa.arrivillagaはすでに 'str'がローカルに再定義されていると述べています。だから、あなたは現在のスコープで 'str()'を使うことはできませんでしたが、あなたはグローバルなスコープでできました。 –

+0

'str'はこの時点では関数ではありません –

2

strが組み込み関数であっても、これは変数として使用しないでください。

はい、該当します。 Pythonは足で自分を撃つことを止めません。開発者としては、組み込みの名前を上書きしないようにするのはあなた次第です。

実際には何が起こっていますか?私の推測は、strはもはや関数として使用できなくなりますが、彼が書いた関数の範囲内でのみ使用できます。あれは正しいですか?これにより、グローバルにstrが再定義されることはありません。

ここでも部分的に正しいです。 strの値がローカルに上書きされると、現在のスコープだけが影響を受けます。 strのグローバル値は変更されません。ただし、strグローバルスコープに書き込まれている場合は、すべてのサブスコープに影響します。この背後にある理由は、実行時にPythonインタプリタが値をコンパイルする方法です。 strfoo()の範囲にのみ上書きされますので、最初の例では、作品

>>> def foo(): 
...  str = 0 
...  return str 
... 
>>> foo() 
0 
>>> str(0) 
'0' 
>>> 

:この動作は、簡単な例を用いて観察することができます。

>>> str = 0 
>>> def foo(): 
...  return str(0) 
... 
>>> foo() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo 
TypeError: 'int' object is not callable 
>>> 

あなたは常に、その本来の意味にかかわらず、(Pythonの2に__builtin__builtinをインポートし、strの値をリセットすることができます:strがグローバルに上書きされるので、この第二の例は、しかし、失敗した

>>> str = 0 
>>> str 
0 
>>> import __builtin__ 
>>> str = __builtin__.str 
>>> str 
<type 'str'> 
>>> str(0) 
'0' 
>>> 
関連する問題