【python】为什么修改全局的dict变量不用global关键字

转自:http://my.oschina.net/leejun2005/blog/145911?fromerr=qnPCgI19#OSC_h4_8

为什么修改字典d的值不用global关键字先声明呢?

s = ‘foo‘
d = {‘a‘:1}
def f():
    s = ‘bar‘
    d[‘b‘] = 2
f()
print s  # foo
print d  # {‘a‘: 1, ‘b‘: 2}

这是因为,在s = ‘bar‘这句中,它是“有歧义的“,因为它既可以是表示引用全局变量s,也可以是创建一个新的局部变量,所以在python中,默认它的行为是创建局部变量,除非显式声明global,global定义的本地变量会变成其对应全局变量的一个别名,即是同一个变量。

在d[‘b‘]=2这句中,它是“明确的”,因为如果把d当作是局部变量的话,它会报KeyError,所以它只能是引用全局的d,故不需要多此一举显式声明global。

上面这两句赋值语句其实是不同的行为,一个是rebinding(不可变对象), 一个是mutation(可变对象).

但是如果是下面这样:

d = {‘a‘:1}
def f():
    d = {}
    d[‘b‘] = 2
f()
print d  # {‘a‘: 1}

在d = {}这句,它是”有歧义的“了,所以它是创建了局部变量d,而不是引用全局变量d,所以d[‘b‘]=2也是操作的局部变量。

推而远之,这一切现象的本质就是”它是否是明确的“

仔细想想,就会发现不止dict不需要global,所有”明确的“东西都不需要global。因为int类型str类型之类的不可变对象,每一次操作就重建新的对象,他们只有一种修改方法,即x = y, 恰好这种修改方法同时也是创建变量的方法,所以产生了歧义,不知道是要修改还是创建。而dict/list/对象等可变对象,操作不会重建对象,可以通过dict[‘x‘]=y或list.append()之类的来修改,跟创建变量不冲突,不产生歧义,所以都不用显式global。

时间: 2024-08-28 18:05:21

【python】为什么修改全局的dict变量不用global关键字的相关文章

飘逸的python - 为什么修改全局的dict变量不用global关键字

比如下面这段代码 s = 'foo' d = {'a':1} def f(): s = 'bar' d['b'] = 2 f() print s print d 为什么修改字典d的值不用global关键字先声明呢? 这是因为, 在s = 'bar'这句中,它是"有歧义的",因为它既可以是表示引用全局变量s,也可以是创建一个新的局部变量,所以在python中,默认它的行为是创建局部变量,除非显式声明global. 在d['b']=2这句中,它是"明确的",因为如果把d

PHP 闭包获取外部变量和global关键字声明变量的区别

最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和global关键字声明变量的区别. 闭包 闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读. 闭包可以通过拷贝的方式让函数使用父作用域中的变量.如: $global = 'hello'; $bbb = function()use($global){ echo $global.

python中修改函数内部的变量会发生什么

最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su() #执行这段代码会报错(如果只是调用不修改是不会报错的) 更改为: #!/usr/bin/env python a = 100def su(): global a a = a + 1 print(a) s = su() 总结: 在python的函数中和全局同名的变量,如果修改变量的值就会变成局部变

Python实用技巧:global关键字的用法详解

这篇文章主要介绍了python global关键字的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下: 想要更好的了解global关键字,首先要熟悉python的全局变量与局部变量的概念.global关键字的作用是可以申明一个局部变量为全局变量,下面看一下实例 一.变量作用域的说明 1.局部变量 1 def a(): 2 ## 菊部变量 - ,- 3 local = 1 4 print(local) 5 ## 全局无法使用,只有自己可用

浅析python中的类变量和对象变量

刚学python,学到了有关于类和对象的地方.对一个概念有点模糊,后来通过实践编码找到一定规律 在python中 class test(object): id=2 name='tt' list=['tt','dd'] def change(self,newA,new_id): self.id=new_id self.age=newA return self.age t1 = test() t1.change(21, 3) print t1.id #3 t2 = test() t2.age = 2

十分钟快速入门 Python,看完即会,不用收藏!

本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. 读完本篇文章后,可对 Python 语言特性.编码风格有一定了解,并可写出简单的 Python 程序. 100?多位经验丰富的开发者参与,在 Github 上获得了近?1000?个?star?的开源项目想了解下吗?项目地址:github.com/cachecats/c- 一.安装与运行 各个系统的 Pyth

Python批量修改文件格式

工作中遇到要把多个apk格式文件改成zip包格式,这是一个繁琐的步骤.利用Python脚本并自定义右键运行.py文件给工作带来很大的方便,下面做一个简单的介绍: 前置条件: 要修改的apk包名称:XXXX_CN.apk: 修改后的zip包名称:CN.zip: 操作前把批量修改的apk文件放到同一个文件夹,且把下面写好的.py脚本文件也放到里面去. Python代码: import os                          #导入os系统命令格式 format='zip'      

[转载]Python 3 collections.defaultdict() 与 dict的使用和区别

文章转自: http://www.cnblogs.com/herbert/archive/2013/01/09/2852843.html Python 3 collections.defaultdict() 与 dict的使用和区别 在Python里面有一个模块collections,解释是数据类型容器模块.这里面有一个collections.defaultdict()经常被用到.主要说说这个东西. 综述: 这里的defaultdict(function_factory)构建的是一个类似dict

Python _X __all__ 模拟 导入&#39;私有&#39;变量 及其注意点和实例

开头是下划线的变量(如_X): 在特定的情况下,可以吧下划线放在变量名的签名(如_X)可以防止客户端使用from *语句导入模块名时,把其中的那些变量名复制出去:但是下划线不是'私有'声明:仍可以使用其他导入形式看见并且修改这类变量例如使用import __all__(语句) 此外也可以在模块顶层把变量名的字符串列表赋值给变量__all__以达到类似_X命名惯例的隐藏效果:使用此功能,from*语句只会把列在__all__列表中的这些变量名复制出来 __all__是指出要复制的变量名,而_X时指