如何更好理解list中的+= ?死记硬背吗
本帖最后由 jcpython2 于 2022-10-10 17:37 编辑list中 a += b 和 a = a+ b不同,这个平时稍有不注意就当成一样的了,如何更好理解这个点? 靠死记硬背吗? 我经常在其他非list用法把 x +=y 当成x = x +y
b = a =
a += #ab指向同一个地方,在a末尾添加元素,b也受影响
》》
a = a + #对a重新赋值,不会影响到b
print(a,b)
》》 因为小甲鱼教程中一开始强调的一段是 指向
然后到了list就有点不一样了 b=a =
c = a * 3
print(c)
c = *3
print(c)
[, , ]
{:10_269:}{:10_269:}{:10_269:}{:10_269:} a += b 就是a = a + b 列表也不例外
看看这个,有什么疑问吗?
>>> a =
>>> b =
>>> c = a[:]
>>> d = b[:]
>>> a += b
>>> a
>>> c = c + d
>>> c
>>> b
>>> d
>>> 本帖最后由 阿奇_o 于 2022-10-10 21:11 编辑
关键1:搞清楚 操作的是什么对象 —— 具体什么操作? 针对哪个对象?
以你提到的 a = a + 和 a += 的不同之处:
前者是 两个列表的相加操作,会返回新的列表对象;后者是 “扩展运算符”或叫“增量赋值运算符” 的运算操作,是就地改变原来的a
(等到学到OOP且比较深入时,你就会了解 定义一个python对象时,如果实现 __add__ 就可以自定义相加的行为和返回,而 __iadd__ 就可以自定义后者 += 的行为和返回)
a = b =
id(a) == id(b)
True
id(a)
2556956942336
a +=
id(a)
2556956942336
a
a = a +
id(a)
2556988297344
a
id(b)
2556956942336
id(a) == id(b)
False
b
关键2:对象 到底是什么? 为什么说你看不见它,却可以 调用/使用 它?
- 为什么我对象可以叫a,b,c,x,y,z, 可以叫 小兰,也可以叫 亲爱的? —— 唤之以名。(可 叫它,叫它"老婆" 它就一定会来吗,一定会满足你的要求吗?)
- 对象的类型type 不同会对各种操作有什么影响?(你对象是男是女的?对生娃肯定又影响!如 list就是“可变的”,str, tuple就是“不可变的”。)
- 对象的id, id(obj) 是什么?有什么用? (你对象是不是你的“唯一”?。。哈哈哈)
- 对象的value,可以看做 值,延伸出来就是 属性和方法。(你对象的颜值多少?身高多少?会做饭么?... )
ps: 关于对象的具体代码例子,我懒得敲了,我以前回答的帖子,已经举出足够多了。。
jackz007 发表于 2022-10-10 18:27
a += b 就是a = a + b 列表也不例外
看看这个,有什么疑问吗?
我没说清楚缘由,看我下面两段代码,输出不一样
b = a =
a +=
print(a)
print(b)
第二段代码
b = a =
a = a +
print(a)
print(b)
阿奇_o 发表于 2022-10-10 21:05
关键1:搞清楚 操作的是什么对象 —— 具体什么操作? 针对哪个对象?
以你提到的 a = a +
我先消化下 jackz007 发表于 2022-10-10 18:27
a += b 就是a = a + b 列表也不例外
看看这个,有什么疑问吗?
还比如这个
b c 各= 了a
b 成了新列表
c 挂在a那头随a变动
a =
b = a *3
c = * 3
a = '99'
print(a)
print(b)
print(c)
[, , ] 本帖最后由 jcpython2 于 2022-10-11 13:40 编辑
阿奇_o 发表于 2022-10-10 21:05
关键1:搞清楚 操作的是什么对象 —— 具体什么操作? 针对哪个对象?
以你提到的 a = a +
简单归纳了下,应该算是弄懂了点,但还没学到python的对象内容
顺便做了一道题,自己家的注释,有没有理解错
b =
a = *2 + *2#a重新赋值为 * 2,b后期变动不影响a,
# 前面的 * 2的值与后面 * 2的值相同,并且指向同一内存,修改变动跟随
#a[,]等于第二行第一部分*2结果,指向同一内存,所以a变动后
#a[,,,]所有均变动为
a = #
print(a)
print((a))
b = #a已经指向其他内存,b变动不影响
print(b)
[[], [], [], []]
本帖最后由 jcpython2 于 2022-10-11 22:29 编辑
阿奇_o 发表于 2022-10-10 21:05
关键1:搞清楚 操作的是什么对象 —— 具体什么操作? 针对哪个对象?
以你提到的 a = a +
如上图所示,我的想法是+ *都是运算符,为什么*得出了新地址,+没有发挥相同作用呢(图1),就如我图一那样,为什么a = [] * 2 + [] *2后出来两个内存地址,而不是一个呢? + 有特别意义?
比如
a =
a *= 5
无错
a =
a += 5
因为+在这里不是加,是‘拼接’这样理解对吗 本帖最后由 阿奇_o 于 2022-10-12 14:14 编辑
你看不懂中文,或阅读理解有问题,或者 现在因为你背景知识不足,无法全部理解。 学完面向对象编程OOP部分,再回过头看看吧。
就简单说一下, 就是要区分 不同的操作会产生 就地修改,还是返回新的对象。
a *= 5 或其他 +=,-=,/= 等是 “增量赋值算术运算符” ,会 就地修改。这种等价于 a.__imul__(5) , a.__iadd__(b) 等 (就是调用了对象的特定的特殊方法)。
a = a * 5 或其他+,- ,/ 等是 一般的 “算术运算符” 都是 返回新的对象,并与字符a绑定(重新赋值)。 这等价于 如a.__mul__(5) , a.__add__(b)
阿奇_o 发表于 2022-10-12 14:10
你看不懂中文,或阅读理解有问题,或者 现在因为你背景知识不足,无法全部理解。 学完面向对象编程OOP部分 ...
是的,我的环境比较差,学习背景也几乎没有,无论从教程文字还是数学理论都是在硬吃的阶段,比较苦,所以一旦涉及到疑问卡主都是反复尝试后才敢来论坛提问,很多时候什么我没办法解释到疑点,也是比较吃力,有时候甚至要背代码,求逻辑搞不清的时候,起码不会写错代码,方便排查 >>> a = b =
>>> id(a)
53038856
>>> id(b)
53038856
>>> a +=
>>> a
>>> id(a)
53038856
>>> id(b)
53038856
>>> c = d =
>>> id(c)
53055592
>>> id(d)
53055592
>>> c = c +
>>> c
>>> d
>>> id(c)
53038664
>>> id(d)
53055592
我理解的是‘a +=’ a和b 2个变量指向同一的内存地址。一个变动另外一个也变动,因为列表本身就是可以变的
c = c+这个是算数运算符,相当于c重新赋值了,但是d还是指向原来的内存地址 还有你说的+和* 不同 你应该去看一下嵌套列表,那里有详细的讲这个问题,还有列表拷贝的问题. 本帖最后由 阿奇_o 于 2022-10-12 16:23 编辑
jcpython2 发表于 2022-10-12 14:35
是的,我的环境比较差,学习背景也几乎没有,无论从教程文字还是数学理论都是在硬吃的阶段,比较苦,所以 ...
没事,【认清现实,笃信成长】就好,我也是一学渣大专生。 基础差点,就慢慢来。
-入门推荐:
- 《计算机是怎样跑起来的》、《计算机科学导论》 背景知识、硬件知识、整体了解CS
-《Think Python》《Python修炼之道》以及 多看看《官方文档》(特别是Howto系列)等。
-《Python GUI设计——tkinter菜鸟编程》
-进阶推荐:
-《Fluent Python》《Python Cookbook》等
- 算法,设计模式,等等。
-数据分析向 肯定要推:
-《用Python进行数据分析》Python For Data Analysis(可以第一版中文为主,第二版英文为辅助)
-爬虫方向 :
-《Python3网络爬虫开发实战》入门与进阶
另外,多用善用搜索,顺便用熟英文,认认真真啃书,老老实实敲代码 —— 成长必然。
—— 最后 死而无憾。 共勉。
阿奇_o 发表于 2022-10-12 16:22
没事,【认清现实,笃信成长】就好,我也是一学渣大专生。 基础差点,就慢慢来。
-入门推荐:
-...
我现在其实自己感觉最大的问题就是只会死记硬背,我在牛客网把入门题都刷遍了,刷完又看了别人的答案,别人的写法让我茅塞顿开,感觉这一种方式让我成长很快,现在我是学一章节就把牛客网力扣小甲鱼的课后作业相关内容刷了,面试题还遥不可及{:10_282:}{:10_282:}这两天在看书,就嗑书的例子,你说的Python Cookbook也有了 简单滴滴 发表于 2022-10-12 14:38
我理解的是‘a +=’ a和b 2个变量指向同一的内存地址。一个变动另外一个也变动,因为列表本身就 ...
我一开始也是这么简单想的,做了两道题就开始乱了
比如下面这题猜print a得出啥,我这个贴就是这个题引发的
a = [] * 2 + [] *2
a = 5 jcpython2 发表于 2022-10-12 17:02
我一开始也是这么简单想的,做了两道题就开始乱了
比如下面这题猜print a得出啥,我这个贴就是这个题 ...
a = [] * 2 + [] *2
里面的2个*2不是一个对象,虽然他们看起来一样
>>> a = *2
>>> b = *2
>>> id(a)
43925800
>>> id(b)
43775240 简单滴滴 发表于 2022-10-12 17:32
里面的2个*2不是一个对象,虽然他们看起来一样
我一开始也明白他们只是看着一样,但并不是同一对象
我当初迷惑的是第一段输出是[, , , ]
我一开始以为前面的都是独立的,因为我眼中 + *一样,既然+独立了*也是独立
所以卡主了好久好久
页:
[1]