2015-01-09 3 views
1
def func(): 
     global x 
     print 'x is', x 
     x = 2 
     print id(x) 
     print 'Changed global x to', x 

x = 50 
print id(x) 
func() 
print 'Value of x is', x 
print id(x) 

выходидентичность питон для глобальных переменных

32308172 
x is 50 
32308748 
Changed global x to 2 
Value of x is 2 
32308748 

Я ожидаю id() должен возвращать одинаковое значение для всех трех раз, так как же копия x используется всеми во всем мире. Почему это так.

+0

Целые являются незыблемыми, и 'global' относится к ** имя **' x', не то, что основной объект это случается назначен. Посмотрите, например. http://nedbatchelder.com/text/names.html – jonrsharpe

+0

это идентификатор объекта, а не переменной. try: 'a = 1'' id (a) '' b = 1' 'id (b)' – Roberto

+0

@Roberto в CPython, этот пример может приводить к запутывающим результатам, так как маленькие целые числа * интернированы *. – jonrsharpe

ответ

0

Они относятся к разным объектам («маленькие целые числа»). См., Например, http://www.laurentluce.com/posts/python-integer-objects-implementation/.

Поскольку целые числа являются неизменными, глобальное имя x относится к разным ячейкам памяти, если изменяется значение переменной.

3

«Переменные» в Python - это только метки, которые вы прикрепляете к объектам. Функция id() возвращает идентификатор объекта, который вы передаете ему, а не идентификатор «переменной». Если вы укажете имя на другой объект, вы получите другой идентификатор.

+0

Извините, я не понимаю. Я думаю, что если мы будем использовать ключевое слово «global», увидев, что имя не будет создано никаким другим местоположением памяти, следует использовать такое же расположение памяти x (определенное вне функции). Предполагая, что id() возвращает ячейку памяти. – user1423015

+0

@ user1423015: Нет, имя не относится к ячейке памяти в Python, независимо от глобального или нет. Имя - это только метка, которая может быть прикреплена к произвольным объектам. Вы можете прикрепить несколько имен к одному и тому же объекту без каких-либо проблем. Глобальное ключевое слово объявляет, что какое-то имя должно быть * скопировано * глобально, что полностью не связано с ячейками памяти. Это просто означает, что если вы переназначите это имя, глобальное имя будет привязано к другому объекту, вместо того, чтобы создавать новое локальное имя. –

0

Причина изменения значения x заключается в том, что вы определяете x как global в своей функции, поэтому угроза python с x как глобальной переменной в объеме модуля, а также id вашего объекта будет изменена как целые числа неизменяемы, и после назначения python создайте новый адрес для вашего объекта.

если вы не используете функцию, вы увидите тот же результат:

>>> x=2 
>>> id(x) 
33263936 
>>> x=4 
>>> id(x) 
33263888 
Смежные вопросы