zoukankan      html  css  js  c++  java
  • python数据赋值后,修改新数据,原数据如何保证不被修改?

    python中对象,赋值后是同一地址,如果是可变对象,对其中一个修改会影响到另一个,如果要生成完全新的对象,应使用deepcopy
    import copy
    data1=copy.deepcopy(data)

    Python是一门独特的语言,与C语言有很大区别,初学Python很多萌新表示对变量与赋值不理解,学过C的都知道,给变量赋值时,需要先指定数据类型,同时会开辟一块内存区域,用于存储值,例如:

    int a = 1;

    a 就是内存空间中的一小块区域,就像是一个大房间里面的一个小盒子,赋值就是把整数1装载到盒子里面。

    现在给变量a重新赋值

    a = 2;

    盒子依然是那个盒子,也就是说内存地址没有变,只是该段内存中的值变了,变成了2。

    再来看:

    int b = a;

    当把变量a赋值给另外一个变量b时,相当于把值拷贝了一份传递给变量b,b是新开辟的一段内存区域

    而在Python中,“变量”的严格叫法是“名字(name)”,也可以理解为标签,就像我们人的姓名一样,名字就是挂在人身上的一个标签。

    >>> 10-a
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
    NameError: name 'a' is not defined

    比如上面这段错误报的是name ‘a’ 没有定义,而没有说成 variable。

    在Python中,给变量赋值就是相当于给对象贴标签,就像我们给人取名字一样,变量本身是没有任何意义的,它没有类型信息,真正的信息都在对象身上。

    例如:

    a = 1

    Python内部首先会分配一段内存空间用于创建整数对象1,然后给这个1贴上名为a的标签。

    然后执行

    a=2


    Python接着会在另一块内存区域创建整数对象2,然后把标签a从1身上撕下来贴在2身上,此时,我们没法再通过a来得到1这个值了。

    现在把名字a赋值给另外一个名字b

    b = a
    
    

    相当于在刚才的2身上又贴了一个新的标签b,注意,这里和C语言是完全不一样的,定义b的时候不需要分配内存空间,这样我们既可以通过a来访问2也可以通过b来访问2,访问的都是同一个对象,就好比我们给宝宝取名时既有小名也有大名,其实叫的都是同一个人。

    虽然我们通常在Python中还是用”变量”的叫法(因为在编程语言中这是一种通用叫法),但是我们需要理解Python中的变量不同于其他语言,变量只是一个名字。

    理解了Python中的变量与赋值后,再来看函数的参数传递,如下所示:

    >>> def fun_a(a):
    ...    a = a+4
    ...
    >>> g = 0
    >>> fun_a(g)
    >>> g
    0

    全局变量g传递给函数fun_a时,相当于函数中的参数a也将作为标签贴在0上,随后a被重新赋值了(a=a+4),相当于从0撕下标签a贴到4身上,然后g依然还是0上面的标签。

    再来看这个函数,传递的是一个列表对象

    >>> def fun_b(names):
    ...    names[0] = ['x', 'y']
    ...
    >>> n_list = ['a','b','c']
    >>> fun_b(n_list)
    >>>
    >>> n_list
    [['x','y'], 'b', 'c']

    与前面的步骤还是一样的,names 和 n_list 都是[‘a’,’b’,’c’]上的一个标签,只是列表中的第0个元素被重新赋值了,但是names和 n_list 依然都贴在这个列表对象身上,虽然 n_list的值更新了,但对象依然是原来那个对象。就好比张三和小张都是同一个人,现在给小张换件衣服时,其实就是给张三换件衣服,人还是那个人,只是它身上的东西发生了变化。

  • 相关阅读:
    【leetcode】416. Partition Equal Subset Sum
    【leetcode】893. Groups of Special-Equivalent Strings
    【leetcode】892. Surface Area of 3D Shapes
    【leetcode】883. Projection Area of 3D Shapes
    【leetcode】140. Word Break II
    【leetcode】126. Word Ladder II
    【leetcode】44. Wildcard Matching
    【leetcode】336. Palindrome Pairs
    【leetcode】354. Russian Doll Envelopes
    2017.12.22 英语面试手记
  • 原文地址:https://www.cnblogs.com/blogofzxf/p/10896191.html
Copyright © 2011-2022 走看看