浅谈Python中对列表的不同操作对地址的影响

a=[1,2,3,4,5]
b=a[:]
c=list(b)
a2=a
a2[0]=5

我们来看这几个语句,第一,二,三行分别定义了一个列表,对列表进行切片操作并创造一个新列表赋值给b,对b列表(或任何可迭代数据)转换为列表类型,并返回转换后的列表赋值给c,这样理解下来那列表a,b,c分别指向内存中不同的地址。

第四行中我们把a列表赋值给了变量a2,那么a2的地址是否和a的地址一样呢?答案是肯定的,我们对a2的第一个元素进行赋值操作来改变元素的值,我们发现a列表中元素也发生了同样的改变,证明了上述结论,这里有个很好的网站->pythontutor,可以实现可视化代码的执行过程(不只是python)。

以上这些操作(除了第五行)都是非破坏性的,也就是说每个操作都不是改变输入的操作,例如第二行语句并没有改变列表a,那如果把语句 a2[0]=5 替换成语句 a2[0]=['a','b'] 呢,我们发现列表a2的第一个元素指向的是列表['a','b'] 的地址。

再来看个有趣的问题,我们看以下语句

a=[1,2,3,4,5]
b=a
a=a+[6,7]

我们把列表赋值给a,然后把a赋值给b,现在a和b就指向同一个地址了,然后我们执行a=a+[6,7],我们发现,该操作会返回一个新列表,也就是说a指向的地址被改变了

那如果指向语句a+=[6,7] 呢,我们发现他并没有返回一个新列表,而是在旧列表上进行改变,这很神奇!

我们再来看看append和extend方法

执行语句

a=[1,2]
b=[3,4]
a.append(b)
b[0]='woshishabi'

我们发现把b嵌套进a后,对b的改变,也会影响到a,然而extend就不会,执行以下语句,我们就可以看出区别。

a=[1,2]
b=[3,4]
a.extend(b)
b[0]='woshishabi'

记录这些只是感觉比较有趣,我们平时使用的时候一般只需要知道执行的结果就可以了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idMiFeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值