Str уже определен как глобальная переменная - PullRequest
0 голосов
/ 10 мая 2018

Я заметил что-то действительно странное при работе с функциями. Похоже, имя переменной 'str' уже определено как глобальная переменная. Взгляните:

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

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

Переменная str определена в примере функции. Так почему же нет NameError: имя 'str' не определено?

Когда я вызываю переменную x или что-то еще (в данном случае 'bar'):

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

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

Почему переменная с именем 'str' действует как глобальная переменная?

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Причина, по которой это не удается:

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), который не удался.

0 голосов
/ 10 мая 2018

Если вы хотите использовать ключевое слово в качестве имени переменной, по соглашению используется одиночное конечное подчеркивание, чтобы избежать конфликтов с ключевыми словами Python, например:

single_trailing_underscore_

Cf. PEP 8 - Руководство по стилю для кодов Python

0 голосов
/ 10 мая 2018

В python str () является строковым конструктором. Используется для приведения объекта к строке.

Вы можете использовать его локально, но это отменит доступ к функции. Вы больше не сможете использовать str ().

для справки: https://docs.python.org/2/library/functions.html#str

class str (object = '')

Возвращает строку, содержащую хорошо распечатываемое представление объект. Для строк это возвращает саму строку. Различия с repr (объект) в том, что str (объект) не всегда пытается вернуть строку, приемлемую для eval (); его цель - вернуть строка для печати. Если аргумент не указан, возвращает пустую строку, ''.

В целях общего знания вы можете вернуть свой конструктор, если удалите переменную. Например:

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

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

del str

str(test)
>>>'1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...