经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
python3 完全理解赋值,浅copy,深copy 通过地址详细理解~
来源:cnblogs  作者:晓风小峰  时间:2019/4/15 8:53:30  对本文有异议

额。。。老规矩,先来一天NLP再说,也没几条了。

十,在任何一个系统里,最灵活的部分是最能影响大局的部分

  灵活便是有一个以上的选择,选择便是能力,因此最灵活的人便是最有能力的人。

  灵活来自减少只相信自己的一套信念,价值和规条,而多凭借观察运用环境所提供的其他条件。

  灵活是使事情更快有效的的重要因素,因此,亦是人生成功快乐的重要因素。

  灵活亦是自信的表现,自信越不足,坚持某个模式的态度会越强硬。

  容许不同的意见和可能性,便是灵活。

  在一个群体中,固执使人紧张,灵活使人放松。

  灵活不代表放弃自己的立场,而是容许找出双赢的可能性(更进一步而三赢)。

  在沟通中,明白人不代表接受,接受不代表投降(放弃立场)。

  “流水”是学习灵活的老师。

  灵活是用自己的步伐去做出转变,而固执则是在被压迫的情况下做出转变。


 

赋值,以及深浅copy的理解

赋值的时候,是把内容的地址给这个变量,内容是不可变数据类型,如 int, str, bool, tuple,时,一个值对应一个固定的地址。

但是如果内容是可变数据类型时,如list,dict,set的时候,拿列表来举例子 : 列表整体有个地址,他是可以变化的,即两个长得一样的列表,他们整体的地址可以不同。

然后这个整体的列表地址对应的是列表各个内容,即各个元素所对应的各自的地址,比如其中一个内容是一个数字,数字是不可变类型数据,其地址是固定的一个值,如果是一个嵌套的列表,那就是再来一次整体可变地址指向内容地址。

实验结果如下:

  1. 1 #!usr/bin/env/ python
  2. 2 # -*- coding:utf-8 -*-
  3. 3 # Author: XiaoFeng
  4. 4 import copy
  5. 5 # 赋值 对于不可变数据类型,赋值就是相当于把数据的地址复制给变量
  6. 6 a = "abc" # ”abc“的地址给a
  7. 7 b = a # a所存的内容,即“abc"的地址复制给b
  8. 8 c = a # a所存的内容,即"abc"的地址复制给c
  9. 9 print(a, id(a))
  10. 10 print(b, id(b))
  11. 11 print(c, id(c))
  12. 12 c = "32" # "32”的地址给c
  13. 13 print(a, b, c, id(a), id(b), id(c))
  14. 14 # 对于可变数据类型,赋值也是相当于把数据的地址复制给变量
  15. 15 a = [1, 2, 3] # 把列表的地址给a
  16. 16 b = a # 把a的内容,即列表的地址复制给b
  17. 17 c = a # 把a的内容,即列表的地址复制给c
  18. 18 print(a, id(a))
  19. 19 print(b, id(b))
  20. 20 print(c, id(c))
  21. 21 c.append("别人会变吗?") # 从c得到列表的地址,找到列表,然后更改列表的内容
  22. 22 print(a, b, c, id(a), id(b), id(c)) # 结果当然就变喽
  23. 23 # 浅copy
  24. 24 li = [1000, "sa"*30, 3, [12]] # 把列表的每一个元素的地址组合成一个列表,然后把这个列表的地址给li
  25. 25 li2 = li.copy() # 复制原列表的元素的地址,然后组合成一个新的列表,再把这个新列表的地址给li2
  26. 26 li2[3].append("嵌套的会变吗?") # 会的,因为里层元素的地址没变
  27. 27 li2.append("会变吗?") # 不会,因为新列表最外层是新的地址了
  28. 28 print(li, id(li), id(li[1]), id(3))
  29. 29 print(li2, id(li2), id(li2[1]), id(3))
  30. 30 # 深copy
  31. 31 li = [10000, "q", ["6", 9], 7]
  32. 32 li2 = copy.deepcopy(li)
  33. 33 print(li, id(li), id(li[0]), id(li[2]))
  34. 34 print(li2, id(li2), id(li2[0]), id(li2[2])) # 哈哈,果然嵌套得列表地址不一样了
  35. 35 li[2].append(1000)
  36. 36 print(li, li2, id(li[2]), id(li2[2])) # 成功!
  37. 37 # 来试个嵌套嵌套
  38. 38 li = [1, [2, [3]]]
  39. 39 li2 = copy.deepcopy(li)
  40. 40 print(li, id(li[1][1]), li2, id(li2[1][1])) # 地址很像,但不一样了,差点看错。。。估计是迭代的把所有可变类型的数据给了新地址
  41. 41 li[1][1].append("会变吗")
  42. 42 print(li, id(li[1][1]), li2, id(li2[1][1])) # 假设成功,神奇啊 哈哈哈哈

运行结果如下:

  1. E:\Python\python.exe E:/python_code_dir/Python_hight/Day_11/copy_test.py
  2. abc 12768896
  3. abc 12768896
  4. abc 12768896
  5. abc abc 32 12768896 12768896 49285504
  6. [1, 2, 3] 12404176
  7. [1, 2, 3] 12404176
  8. [1, 2, 3] 12404176
  9. [1, 2, 3, '别人会变吗?'] [1, 2, 3, '别人会变吗?'] [1, 2, 3, '别人会变吗?'] 12404176 12404176 12404176
  10. [1000, 'sasasasasasasasasasasasasasasasasasasasasasasasasasasasasasa', 3, [12, '嵌套的会变吗?']] 86211600 13259224 1360779472
  11. [1000, 'sasasasasasasasasasasasasasasasasasasasasasasasasasasasasasa', 3, [12, '嵌套的会变吗?'], '会变吗?'] 12825984 13259224 1360779472
  12. [10000, 'q', ['6', 9], 7] 12805984 86039520 86150280
  13. [10000, 'q', ['6', 9], 7] 86211600 86039520 12827144
  14. [10000, 'q', ['6', 9, 1000], 7] [10000, 'q', ['6', 9], 7] 86150280 12827144
  15. [1, [2, [3]]] 12825984 [1, [2, [3]]] 12827184
  16. [1, [2, [3, '会变吗']]] 12825984 [1, [2, [3]]] 12827184
  17. Process finished with exit code 0

 

还有一个数字符串里有多少数字的代码:

  1. 1 #!usr/bin/env/ python
  2. 2 # -*- coding:utf-8 -*-
  3. 3 # Author: XiaoFeng
  4. 4
  5. 5 # 找字符串里有多少个数
  6. 6 o = -2
  7. 7 count = 0
  8. 8 x = input("<<<").strip()
  9. 9 for index, i in enumerate(x):
  10. 10 print(x)
  11. 11 if i.isalpha():
  12. 12 continue
  13. 13 if i.isdigit() and index == o + 1:
  14. 14 o = index
  15. 15 else:
  16. 16 count += 1
  17. 17 o = index
  18. 18 print(count)
  19. 19 # 升级版:
  20. 20 args = input("<<<:").strip()
  21. 21 for i in args:
  22. 22 print(args)
  23. 23 if i.isalpha():
  24. 24 args = args.replace(i, " ") # 用空格替换字母 这里的args 变了 但是改的是已经被i接收了的位 没改后面的,所以对后面没影响
  25. 25 final_list = args.split() # 默认以任意数量空格来分割成列表
  26. 26 print(len(final_list))

 

原文链接:http://www.cnblogs.com/xf1262048067/p/10695352.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号