Python中可变对象和不可变对象

我会带着你远行 2022-07-12 05:24 332阅读 0赞

之前写了FPGrowth的代码,写得非常恶心,觉得和C语言、C++的工程文件很不相同。其中就有关于传引用、传值的疑问。

截一段Leetcode的代码

这里写图片描述

这题好像是Leetcode 93附近的一道 获得二叉树最大深度的题目。

我使用了dfs,本来以为python是传对象引用的,所以在dfs中更新了ans,那么返回的ans也会改变,但是最后得到的结果保持1。

经过查看资料我就知道这和命名域以及可变对象和不可变对象有关。

那么我们来说一说可变对象和不可变对象。

列表

先看下面的例子:

  1. >>> l = [1, 2, 3]
  2. >>> ll = l
  3. >>> ll.remove(1)
  4. >>> l
  5. [2, 3]
  6. >>>
  7. >>>a = [1]
  8. >>>b = a
  9. >>>b[0] = 2
  10. >>>a
  11. [2]
  12. >>> l = [1, 2, 3]
  13. >>> ll = l[:]
  14. >>> ll.remove(1)
  15. >>> l
  16. [1, 2, 3]
  17. >>>

列表是可变对象类型,因此传递的时候,变量名b绑定的内存地址与a绑定的内存地址是同一地址。

我们可以看到,在第一个例子中,我们更改了ll的同时,l也更改了。这是因为我们的复制是浅复制,lll指向同一个对象。

第二个例子是通过便遍历来赋值,则变为深复制。

这和copy中的copy、deepcopy类似。

数值

  1. >>> x = 1
  2. >>> y = 1
  3. >>> x is y
  4. True
  5. >>>id(x) == id(y)
  6. False

数值为不可变类型,x与y指向的是数值为1的同一内存地址。

对于类来说也是如此:

  1. class b:
  2. x = []
  3. def set(self):
  4. self.x.append(1)
  5. def get(self):
  6. return self.x
  7. for i in range(3):
  8. a = b()
  9. print b.__dict__
  10. a.set()
  11. print a.get()
  12. ''' {'x': [], '__module__': '__main__', 'set': <function set at 0x7f89a319bcf8>, '__doc__': None, 'get': <function get at 0x7f89a319bd70>} [1] {'x': [1], '__module__': '__main__', 'set': <function set at 0x7f89a319bcf8>, '__doc__': None, 'get': <function get at 0x7f89a319bd70>} [1, 1] {'x': [1, 1], '__module__': '__main__', 'set': <function set at 0x7f89a319bcf8>, '__doc__': None, 'get': <function get at 0x7f89a319bd70>} [1, 1, 1] '''

python中,万物皆对象。python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址。

python中,对象分为可变(mutable)和不可变(immutable)两种类型。

元组(tuple)、数值型(number)、字符串(string)均为不可变对象,而字典型(dictionary)和列表型(list)的对象是可变对象。

  1. >>>a = 1 #将名字a与内存中值为1的内存绑定在一起
  2. >>>a = 2 #将名字a与内存中值为2的内存绑定在一起,而不是修改原来a绑定的内存中的值,这时,内存中值为1的内存地址引用计数-1,当引用计数为0时,内存地址被回收
  3. >>>b = a #变量b执行与a绑定的内存
  4. >>>b = 3 #创建一个内存值为3的内存地址与变量名字b进行绑定。这是a还是指向值为2的内存地址。
  5. >>>a,b
  6. >>>(2,3)

发表评论

表情:
评论列表 (有 0 条评论,332人围观)

还没有评论,来说两句吧...

相关阅读

    相关 不可对象

    什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态