jcpython2 发表于 2022-10-10 17:35:52

如何更好理解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)
》》

jcpython2 发表于 2022-10-10 17:36:44

因为小甲鱼教程中一开始强调的一段是 指向

然后到了list就有点不一样了

jcpython2 发表于 2022-10-10 18:11:56

b=a =

c = a * 3
print(c)
c = *3
print(c)


[, , ]


{:10_269:}{:10_269:}{:10_269:}{:10_269:}

jackz007 发表于 2022-10-10 18:27:57

      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:05:16

本帖最后由 阿奇_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: 关于对象的具体代码例子,我懒得敲了,我以前回答的帖子,已经举出足够多了。。


jcpython2 发表于 2022-10-10 22:39:03

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)


jcpython2 发表于 2022-10-10 22:39:38

阿奇_o 发表于 2022-10-10 21:05
关键1:搞清楚 操作的是什么对象 —— 具体什么操作? 针对哪个对象?
         以你提到的 a = a +

我先消化下

jcpython2 发表于 2022-10-10 23:53:04

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:39:49

本帖最后由 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:26:39

本帖最后由 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:10:10

本帖最后由 阿奇_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)   

jcpython2 发表于 2022-10-12 14:35:53

阿奇_o 发表于 2022-10-12 14:10
你看不懂中文,或阅读理解有问题,或者 现在因为你背景知识不足,无法全部理解。 学完面向对象编程OOP部分 ...

是的,我的环境比较差,学习背景也几乎没有,无论从教程文字还是数学理论都是在硬吃的阶段,比较苦,所以一旦涉及到疑问卡主都是反复尝试后才敢来论坛提问,很多时候什么我没办法解释到疑点,也是比较吃力,有时候甚至要背代码,求逻辑搞不清的时候,起码不会写错代码,方便排查

简单滴滴 发表于 2022-10-12 14:38:59

>>> 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还是指向原来的内存地址

简单滴滴 发表于 2022-10-12 14:40:06

还有你说的+和* 不同 你应该去看一下嵌套列表,那里有详细的讲这个问题,还有列表拷贝的问题.

阿奇_o 发表于 2022-10-12 16:22:05

本帖最后由 阿奇_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网络爬虫开发实战》入门与进阶

另外,多用善用搜索,顺便用熟英文,认认真真啃书,老老实实敲代码 —— 成长必然。
—— 最后 死而无憾。 共勉。

jcpython2 发表于 2022-10-12 17:00:08

阿奇_o 发表于 2022-10-12 16:22
没事,【认清现实,笃信成长】就好,我也是一学渣大专生。 基础差点,就慢慢来。
-入门推荐:
   -...

我现在其实自己感觉最大的问题就是只会死记硬背,我在牛客网把入门题都刷遍了,刷完又看了别人的答案,别人的写法让我茅塞顿开,感觉这一种方式让我成长很快,现在我是学一章节就把牛客网力扣小甲鱼的课后作业相关内容刷了,面试题还遥不可及{:10_282:}{:10_282:}这两天在看书,就嗑书的例子,你说的Python Cookbook也有了

jcpython2 发表于 2022-10-12 17:02:16

简单滴滴 发表于 2022-10-12 14:38
我理解的是‘a +=’    a和b 2个变量指向同一的内存地址。一个变动另外一个也变动,因为列表本身就 ...

我一开始也是这么简单想的,做了两道题就开始乱了

比如下面这题猜print a得出啥,我这个贴就是这个题引发的
a = [] * 2 + [] *2
a = 5

简单滴滴 发表于 2022-10-12 17:32:19

jcpython2 发表于 2022-10-12 17:02
我一开始也是这么简单想的,做了两道题就开始乱了

比如下面这题猜print a得出啥,我这个贴就是这个题 ...

a = [] * 2 + [] *2


里面的2个*2不是一个对象,虽然他们看起来一样
>>> a = *2
>>> b = *2
>>> id(a)
43925800
>>> id(b)
43775240

jcpython2 发表于 2022-10-12 17:49:24

简单滴滴 发表于 2022-10-12 17:32
里面的2个*2不是一个对象,虽然他们看起来一样

我一开始也明白他们只是看着一样,但并不是同一对象

我当初迷惑的是第一段输出是[, , , ]

我一开始以为前面的都是独立的,因为我眼中 + *一样,既然+独立了*也是独立

所以卡主了好久好久
页: [1]
查看完整版本: 如何更好理解list中的+= ?死记硬背吗