2015-01-09 67 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

它是对象的ID,而不是变量的ID。在CPython中尝试:'a = 1'' id(a)''b = 1'' id(b)' – Roberto

+0

@Roberto,这个例子可能会给出令人困惑的结果,因为小整数是* interned *。 – jonrsharpe

回答

3

Python中的“变量”只是您附加到对象的标签。函数id()返回传递给它的对象的ID,而不是“变量”的ID。如果您将一个名称指向另一个对象,您将得到一个不同的ID。

+0

对不起,我不理解。我在想的是,如果我们使用“全局”关键字,通过查看该名称将不会创建其他内存位置,应使用x的相同内存位置(在函数外部定义)。假设id()返回内存位置。 – user1423015

+0

@ user1423015:不,名称并不是指Python中的内存位置,不管全局与否。名称只是一个标签,可以附加到可打印对象。您可以将多个名称附加到同一个对象,而不会有任何问题。全局关键字声明某个名称是* scoped *全局的,这与内存位置完全无关。这只意味着如果您重新分配该名称,全局名称将被附加到不同的对象,而不是创建一个新的本地名称。 –

0

更改x值的原因是因为您在函数中将x定义为global,所以python威胁将x作为模块范围内的全局变量,并且对象的id将更改为整数是不可变的,分配python后为你的对象创建一个新的地址。

如果你不使用的功能,你会看到同样的结果:

>>> x=2 
>>> id(x) 
33263936 
>>> x=4 
>>> id(x) 
33263888