strが組み込み関数であっても、これは変数として使用しないでください。
はい、該当します。 Pythonは足で自分を撃つことを止めません。開発者としては、組み込みの名前を上書きしないようにするのはあなた次第です。
実際には何が起こっていますか?私の推測は、strはもはや関数として使用できなくなりますが、彼が書いた関数の範囲内でのみ使用できます。あれは正しいですか?これにより、グローバルにstr
が再定義されることはありません。
ここでも部分的に正しいです。 str
の値がローカルに上書きされると、現在のスコープだけが影響を受けます。 str
のグローバル値は変更されません。ただし、str
がグローバルスコープに書き込まれている場合は、すべてのサブスコープに影響します。この背後にある理由は、実行時にPythonインタプリタが値をコンパイルする方法です。 str
がfoo()
の範囲にのみ上書きされますので、最初の例では、作品
>>> 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'
>>>
はい、 'str'はローカルでのみ再定義されます。これはおそらく大きな問題ではないでしょうし、 'max'や' str'のような名前でこのような例が頻繁に見られます。あなたの関数には2行のコードしかない場合は、これ以上の睡眠を失うことはありません。 –
関連:http://stackoverflow.com/q/41029289/2988730 –