刘总的笔记小站

生活常识,娱乐搞笑,编程技巧,智能家居,深度学习,网络神经,数据挖掘

python通过函数入参取回可变对象

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修饰符。


发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
搜索
«   2024年9月   »
1
2345678
9101112131415
16171819202122
23242526272829
30
网站分类
最新留言
文章归档
网站收藏
友情链接
图标汇集
Powered by Z-BlogPHP

  • Copyright ©2021 @liuzong All rights reserved.
  • 陕ICP备17016542号