zoukankan      html  css  js  c++  java
  • 可变对象 及其 作为 函数参数 的注意点

    我们知道 python 的变量分为 可变对象 和 非可变对象;

    可变对象是可以改变的,好像是废话,

    但需要注意的是 可变对象在函数作用域内 改变后,在函数作用域外 也会发生改变

    示例

    ### list
    x = [1, 2]
    def s(y):
        y[0] = 100
        # return y
    
    s(x)
    print(x)        # [100, 2]
    
    
    ### dict
    x = {'a': 1, 'b': 2}
    def s(y):
        y['a'] = 100
    
    s(x)
    print(x)        # {'a': 100, 'b': 2}
    
    
    ### set
    x = set([1, 2])
    def s(y):
        y.add(100)
    
    s(x)
    print(x)        # {1, 2, 100}

    可以看到,只是在 函数内部 对 可变对象进行了修改,在函数外部也变化了

    不想改变可以这么做

    import copy
    x = [1, 2]
    def s(y):
        # y = copy.deepcopy(y)    # 深拷贝
        # y = copy.copy(y)      # 浅拷贝也行
        y = y.copy()          # 浅拷贝也行
        y[0] = 100
        # return y
    
    s(x)
    print(x)        # [1, 2]

    建议直接深拷贝,浅拷贝 有些复杂场景 不行 

    注意  numpy 也是可变对象

    ### numpy 也是可变对象
    x = np.random.randint(1, 5, size=(3, 3))
    y = x
    x[2] = [7, 7, 7]
    print(x)
    # [[1 1 4]
    #  [4 4 4]
    #  [7 7 7]]
    print(y)        # x 变了,y 也跟着变了
    # [[1 1 4]
    #  [4 4 4]
    #  [7 7 7]]
    
    x[2, 2] = 1000
    print(x)
    # [[   1    1    4]
    #  [   4    4    4]
    #  [   7    7 1000]]
    print(y)
    # [[   1    1    4]
    #  [   4    4    4]
    #  [   7    7 1000]]

    参考资料:

    https://www.cnblogs.com/monkey-moon/p/9347505.html

  • 相关阅读:
    《代码整洁之道》之四 注释
    《代码整洁之道》之三 函数
    《代码整洁之道》之二 有意义的命名
    《代码整洁之道》
    Hibernate学习笔记
    Struts2复习笔记
    学习Spring必学的Java基础知识
    Eclipse下搭建Maven框架
    onvif实现
    rtmp服务端实现
  • 原文地址:https://www.cnblogs.com/yanshw/p/15333642.html
Copyright © 2011-2022 走看看