原文:http://blog.chinaunix.net/uid-12038475-id-3532597.html
有一段python代码
test.py
- # -*- coding: gbk -*-
- def f(dictVar):
- print "赋值前 dictVar:",dictVar
- dictVar = {"key2":"value2"}
- print "赋值后 dictVar:",dictVar
- if __name__ == "__main__":
- dictVar = {"key1":"value1"}
- print "调用函数前 dictVar:", dictVar
-
- print "调用函数"
-
- f(dictVar)
-
- print "调用函数后 dictVar:", dictVar
运行结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/36cc329cd2c2e6212b8045f9cf6e6515.png)
解释:
在main模块里面的变量dictVar与fun函数里面的变量dictVar是两个不同的变量,由于他们的名字相同,所以很容易混淆,认为他们是同一变量。
- dictVar = {"key1":"value1"} //将dict指向{“key1”:”value1”}对象
![](https://i-blog.csdnimg.cn/blog_migrate/42ed4a8a93bf86e61f526cecaf60481b.jpeg)
其实python里面的一个变量就是PyObject*的指针变量,可以指向任意类型的对象。
- dictVar = {"key2":"value2"}
对dictVar赋值,使其指向了{“key2”:”value2”}对象,__main__模块的dictVar变量,其指向的对象则不变。
![](https://i-blog.csdnimg.cn/blog_migrate/5a4ee57c96becd2f5be18d9d9e58d7a2.jpeg)
退出fun函数后,局部变量dictVar被释放,恢复主模块的作用域,dictVar仍然指向{“key1”:”value1”}
![](https://i-blog.csdnimg.cn/blog_migrate/e766180d80465f34860e50606c1e3136.jpeg)
关于python对象的理解
test2.py
- # -*- coding: gbk -*-
- def f(dictVar):
- print "赋值前 dictVar:",dictVar
- dictVar.update({"key2":"value2"})
- print "赋值后 dictVar:",dictVar
- if __name__ == "__main__":
- dictVar = {"key1":"value1"}
- print "调用函数前 dictVar:", dictVar
-
- print "调用函数"
-
- f(dictVar)
-
- print "调用函数后 dictVar:", dictVar
![](https://i-blog.csdnimg.cn/blog_migrate/b1bbfaf3247a2093b98a225954c39fe2.jpeg)
dictVar.update({ "key2": "value2"})是在{“key1”:”value1”}dict对象上操作的,dictVar在同一对象上操作,所以该对象的值改变了。