python3 完全理解赋值,浅copy,深copy 通过地址详细理解~

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

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

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

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

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

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

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

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

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

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

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

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


赋值,以及深浅copy的理解

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

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

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

实验结果如下:

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

运行结果如下:

E:\Python\python.exe E:/python_code_dir/Python_hight/Day_11/copy_test.py
abc 12768896
abc 12768896
abc 12768896
abc abc 32 12768896 12768896 49285504
[1, 2, 3] 12404176
[1, 2, 3] 12404176
[1, 2, 3] 12404176
[1, 2, 3, ‘别人会变吗?‘] [1, 2, 3, ‘别人会变吗?‘] [1, 2, 3, ‘别人会变吗?‘] 12404176 12404176 12404176
[1000, ‘sasasasasasasasasasasasasasasasasasasasasasasasasasasasasasa‘, 3, [12, ‘嵌套的会变吗?‘]] 86211600 13259224 1360779472
[1000, ‘sasasasasasasasasasasasasasasasasasasasasasasasasasasasasasa‘, 3, [12, ‘嵌套的会变吗?‘], ‘会变吗?‘] 12825984 13259224 1360779472
[10000, ‘q‘, [‘6‘, 9], 7] 12805984 86039520 86150280
[10000, ‘q‘, [‘6‘, 9], 7] 86211600 86039520 12827144
[10000, ‘q‘, [‘6‘, 9, 1000], 7] [10000, ‘q‘, [‘6‘, 9], 7] 86150280 12827144
[1, [2, [3]]] 12825984 [1, [2, [3]]] 12827184
[1, [2, [3, ‘会变吗‘]]] 12825984 [1, [2, [3]]] 12827184

Process finished with exit code 0

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

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

原文地址:https://www.cnblogs.com/xf1262048067/p/10695352.html

时间: 2024-10-09 07:43:33

python3 完全理解赋值,浅copy,深copy 通过地址详细理解~的相关文章

python 复制 浅copy 深copy 的区别

1.浅copy: 外层添加元素时, 浅拷贝c不会随原列表a变化而变化:内层list添加元素时,浅拷贝c才会变化. 2.深copy: 无论原列表a如何变化,深拷贝d都保持不变. 3.赋值: 赋值对象随着原列表一起变化 深拷贝:只有一种形式,copy模块中的deepcopy函数.     和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素.     深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联. import copy a = [1,2,3,4,5,['a','b'],6]

python中的深copy和浅copy

bytes Python bytes/str bytes 在Python3中作为一种单独的数据类型,不能拼接,不能拼接,不能拼接 >>> '€20'.encode('utf-8') b'\xe2\x82\xac20' >>> b'\xe2\x82\xac20'.decode('utf-8') '€20' 解码 >>> b'\xa420'.decode('windows-1255') '?20' 深copy和浅copy 深copy新建一个对象重新分配内存

浅深copy

前言 列表中的每个元素在内存中都是相互独立的,有自己的唯一标识符,可以通过 id() 函数来查看元素在内存中的唯一标识符. 浅深copy在列表数据量比较大的情况下,不建议使用,比较消耗内存资源. 浅深copy就是在内存中把一个列表复制一份,占用了两份内存空间: 浅copy 元素值未修改 两个列表的唯一标识符不一样,元素的唯一标识符是一样的(两个列表共享一份元素值). 元素值修改后 元素的唯一标识符改变,但是有子列表的情况下,子列表元素唯一标识符不改变. 总结:并非完全独立的两个列表. 深copy

python基础之赋值/深copy/浅copy

首先,不管是赋值还是深浅copy,都是针对那些可能会产生变化的值进行区分的,也就是对于数字,字符串来说,区分赋值,深浅copy是毫无意义的. 那么,让我们来对那些可变的像list set dict tuple……来进行探讨. 赋值: 有两种修改n的方法: 1  直接对n赋值 >>> n=[1,2] >>> g=n >>> id(n) 140529062430792 >>> id(g) 140529062430792 >>&

理解一下python中的浅copy和深copy

最近在学习过程中,了解了一下,浅copy和深copy,做个记录. 所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝. 首先,对赋值操作我们要有以下认识: 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 修改不可变对象(str.tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空间 浅拷贝仅仅复制了容器中元素的地址 >>> user = ['tom', ['age', 20]] >>> user_new = us

【C/C++学院】(6)构造函数/析构函数/拷贝构造函数/深copy浅copy

1.构造函数 类的初始化即为构造函数.也为:隐式的初始化. 构造函数在对象初始化的时候,自动被调用.隐式的调用. 构造函数分为三种:有参构造函数.无参构造函数.拷贝构造函数. 有参构造函数调用有三种:括号法.等号法.手工法. #include <iostream> using namespace std; class Test { private: int m_a; public: Test()//无参构造函数 { } Test(const Test &obj)//拷贝构造函数 { }

深浅copy,何为深浅copy,深copy和浅copy两者有何不同

copy,拷贝,顾名思义,自然是把东西复制过来,呈现在眼前的是一样的,例如: a = [1,2,3,4,5] b = a b.append(6) print(a,b) 输出: [1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] 很明显,a和b的值是一样的.因为对于赋值运算来讲,a与b指向的是同一内存地址,所以他们完全是一样的 浅copy: a = [1,2,3,4,[5]] b = copy.copy(a) b[4].append(6) print(a) print(b)

python学习笔记-(六)深copy&amp;浅copy

在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 1. 赋值 赋值其实只是传递对象引用,引用对象id是一样的.原始列表改变,被赋值的b也会做相同的改变. 1 2 3 4 5 6 7 8 9 10 11 12 13 >>> alist = [1,2,3,["a","b"]] >>> b = alist >>> p

(五)聊一聊深Copy与浅Copy

一.关于浅copy与深copy 首先说明一下: 在python中,赋值其实就是对象的引用,变量就是对象的一个标签,如果把内存对象比喻成一个个房间,那么变量就是门牌号. 深copy与浅copy只是针对可变类型而言,对于不可变类型,无论深浅,值相等,内存地址一样,一旦值发生变化,相当于再创建一个对象. 浅copy有3种方法: a=[1,2,3,["a","b"],22] a1=a[:]  切片操作 a2=list(a)  工厂函数 a3=copy.copy(a)  或