簡體   English   中英

Str已被定義為全局變量

[英]Str is already defined as a global variable

在使用函數時,我注意到一些非常奇怪的東西。 看起來變量名'str'已經定義為全局變量。 看一看:

def Example(x):
   str = input()
   return str

print (Example(str))
#When typing 'Hello!' Output --> Hello! 

變量str在函數Example中定義。 那么為什么沒有NameError:未定義名稱'str'?

當我調用變量x或其他變量(在這種情況下為“ bar”)時:

def Example(x):
   bar = input()
   return bar

print (Example(bar))
#Output: NameError: name 'bar'is not defined

為什么名稱為“ str”的變量充當全局變量?

在python中,str()是字符串構造函數。 它用於將對象轉換為字符串。

您可以在本地使用它,但是它將覆蓋對功能的訪問。 您將無法再使用str()。

供參考: https : //docs.python.org/2/library/functions.html#str

類str(object ='')

返回一個字符串,其中包含對象的可很好打印的表示形式。 對於字符串,這將返回字符串本身。 與repr(object)的區別在於str(object)並不總是嘗試返回eval()可接受的字符串; 它的目標是返回可打印的字符串。 如果未提供任何參數,則返回空字符串“”。

出於一般知識的目的,如果刪除變量,則可以找回構造函數。 例如:

test = 1
str(test)
>>>'1'

str = 2
str(test)
>>>TypeError: 'int' object is not callable

del str

str(test)
>>>'1'

失敗的原因:

def Example(x):
   bar = input()
   return bar

print (Example(bar))
#Output: NameError: name 'bar'is not defined

是因為您試圖將變量bar傳遞給Example()方法,但是從未在調用之前的任何位置定義bar

我不確定如何用此方法完成什么,因為您傳遞了變量但根本不使用它。

評論回應:

str不是內置函數(盡管已在頁面上列出),但它是內置類型str的構造函數。 為了表明您只是簡單地重新分配了與關鍵字(不一定是保留的,但是仍然是關鍵字)關聯的方法,請考慮以下事項:

>>> str
<class 'str'>
>>> abs
<built-in function abs>
>>> str = abs
>>> str
<built-in function abs>

因此,您實際上已經覆蓋了對str類構造函數的分配。 在此示例中,我使用了abs ,但對於input同樣適用(略有不同):

>>> str
<class 'str'>
>>> input
<built-in function input>
>>> str = input
>>> str
<built-in function input>
>>> str = input()
hello world
>>> str
'hello world'

區別在於,您為關鍵字str分配了一個字符串(類型為str )。 因此,您永遠不能使用str(10)來獲取'10'因為這就像調用hello world(10)失敗。

如果要使用關鍵字作為變量名,則按照慣例,使用單個的下划線來避免與Python關鍵字發生沖突,如下所示:

single_trailing_underscore_

cf. PEP 8-Python代碼樣式指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM