全局变量的python标识

全局变量的python标识,python,global,identity,Python,Global,Identity,输出 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) 我希望id()在所有三次中都返回相同的值,因为所有全局用户都使用相同的x副本。为什么它的行为是这样的。它们指的是不同的对象(“小整数

输出

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)

我希望
id()
在所有三次中都返回相同的值,因为所有全局用户都使用相同的
x
副本。为什么它的行为是这样的。

它们指的是不同的对象(“小整数”)。例如,见


由于整数是不可变的,(全局)名称
x
在变量值更改时表示不同的内存位置。

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

更改x值的原因是,您在函数中将x定义为
global
,因此在模块的作用域中将x作为全局变量,此外,对象的
id
也将更改,因为整数是不可变的,并且在分配python之后,将为对象创建一个新地址

如果不使用该函数,您将看到相同的结果:

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

整数是不可变的,
global
指的是名称
x
,而不是它所指定的任何底层对象。例如,它是对象的ID,而不是变量的ID。请尝试:
a=1
id(a)
b=1
id(b)
@Roberto在CPython中,该示例可能会给出令人困惑的结果,因为小整数被插入。@jornsharpe哦,对不起。谢谢你的提醒,真有趣!我应该删除注释,还是将其与基础注释保持原样?请有人解释一下,上面的代码与C指针一样。我来自C语言背景。如果能用图表解释以上代码,我将非常感激。对不起,我不理解。我想的是,如果我们使用“global”关键字,通过看到名称不会创建其他内存位置,那么应该使用与x相同的内存位置(在函数外部定义)。假设id()返回内存位置。@user1423015:否,名称在Python中不引用内存位置,无论是否全局。名称只是可以附加到aribtrary对象的标签。可以将多个名称附加到同一对象而不会出现任何问题。global关键字声明某些名称的作用域是全局的,这与内存位置完全无关。这只是意味着,如果重新指定该名称,则全局名称将附加到另一个对象,而不是创建新的本地名称。
>>> x=2
>>> id(x)
33263936
>>> x=4
>>> id(x)
33263888