python的对象分为不可变对象和可变对象,是否可变对象皆指内存中存储的值是否可以改变。
不可变对象像 不可变对象,该对象所指向的内存中的值不能被改变。像init bool folat str tuple等,赋值会重新创建对象 可变对象,该对象所指向的内存中的值可以被改变。像list dict set赋值会指向引用而不建对象,修改数据联动。
对一个对象调用id函数,可以看出来是否重新创建了对象。比如:
#!/bin/env python # -*- coding:utf-8 -*- import os def getData(varData): varDict = {'iskey':'isval'} varList = ['iskey','isval'] if('dict' == type(varData).__name__): varData.clear() varData.update(varDict) if('list' == type(varData).__name__): del varData[:] #varData = varData.clear() # python3 varData.extend(varList) if('set' == type(varData).__name__): pass return True if __name__ == '__main__': print(os.sep) print(os.name) print(os.curdir) print(os.path.pardir) print(os.path.curdir) print(os.path.sep) print(os.path.altsep) print(os.path.pathsep) a = 'hello'; b = a; c = 'hello'; print( id(a) == id(b) ) # True print( id(a) == id(c) ) # False print( a == b ) # True print( a == c ) # True varData = {'world':'hello'} getData(varData) print('varData=%s'%varData) # {'iskey': 'isval'} varData = ['world','hello'] getData(varData) print('varData=%s'%varData) # ['iskey', 'isval']
1,块级作用域:python没有,比如if for里面定义的变量外层可用 2,局部作用域:python有,函数里面定义的变量外部不可用 3,作用域链:Python中有,变量会由函数内到外找,作用域执行前已定 4,函数在没有执行前,内部代码不执行,这点Python和javascript有共性 li = [lambda :x for x in range(10)] print(li[0]()) # :9 5,函数内部的变量,无global声明直接使用,会去查找外层当做全局变量使用,不可赋值 6,函数内部的变量,如果不加global声明直接赋值定义,会被当做局部变量,跟全局无关 函数定义了本地作用域,而模块定义的是全局作用域。 如果想要在函数内定义全局作用域,需要加上global修饰符。