关于 python 列表的拷贝,和变量直接赋值的区别
首先,我可以先理解 使用 list1[:]是对 原来的列表进行了拷贝操作,在内存中创建了新的位置存同样的数据list2。所以,当我们使用 list1.sort()对 原列表进行修改,不影响list2.
而赋值语句 =,是将不同的标签指向同一个地址,所以当使用 list3 = list1 时,再 list1.sort(),也会使得 list3改变。
那么问题来了:
a = 2
b = a
a = a+2
print(a)
print(b)
按照list的逻辑,输出值应该是 a = 4,b = 4 ............
然后我就不知道怎么分析了。。。。。。。。 因为他本来就不是list,
变量a和b的存储空间是不一样的,
除相互赋值以外,二者互不干扰 >>> list1 =
>>> list2 = list1
>>> list1 = list1 +
>>> list1
>>> list2
这一点上有什么区别嘛{:10_289:} 本帖最后由 kogawananari 于 2020-10-17 16:09 编辑
.sort()的本质是调用的魔术方法__setitem__方法
而字符串 元组 都没有__setitem__方法 这就导致了不同 本帖最后由 jackz007 于 2020-10-17 16:16 编辑
赋值意味着新创建对象,本来变量 a 和 b 都指向整数对象 2,而经过 a = a + 2 的操作之后,内存中的 a 已经指向另外一个新的整数对象了,而 b 依然指向原来的整数对象 2,所以,a 和 b 的值就会不相同。
另外,你说陈述的问题仅仅适合于列表、字典等可变对象,而且,仅限于通过对象的方法来修改对象,这样,原来的对象会发生一些改变,但不会有新对象产生,而赋值就不同了,在 Python 中,赋值意味着定义一个新对象。 前面打错了是 __setitem__
你感受一下
a =
a[:1] = 5
print(a)
a =
a[:1] =
print(a) list1 = #二者地址相同,list1的变动影响list2
list2 = list1
del list1
print(list1)
print(list2)
a = "1234"#二者地址不同,a的变动不影响b
b = a
a = "234"
print(a)
print(b) 昨非 发表于 2020-10-17 16:11
你这个
>>> a = '1234'
>>> b = a
b和a地址是一样{:10_294:}因为
>>> id(a)==id(b)
True kogawananari 发表于 2020-10-17 16:14
你这个
>>> a = '1234'
>>> b = a
>>> a =
>>> b = a
>>> a[:]=
>>> b
我要表达的是这个
这个切片赋值除了字符串和元组都支持 或者说字符串和元组没实现setitem{:10_289:} kogawananari 发表于 2020-10-17 16:14
你这个
>>> a = '1234'
>>> b = a
??等等??
=给a重赋值之后确实b没变啊{:10_284:} 昨非 发表于 2020-10-17 16:21
??等等??
=给a重赋值之后确实b没变啊
{:10_331:}没事 我错乱了 没控制变量{:10_331:} list1 =
list2 = list1[:]
list3 = list1
print(list2)
print(list3)
list1.sort()
print(list1,'1')
print(list3,'3') #list1 和 list3 任然指向同一地址
print(list2,'2')
print(id(list1))
print(id(list3))
print(id(list2))
a = 2
b = a
a = a+2 # 运算后a有了新的地址,而b任然指向原来a的地址
print(a)
print(b)
print(id(a))
print(id(b))
谢谢大家~我应该是明白了,确实是地址发生了变化。
但为什么要做这种设计啊....都用一个逻辑不行吗.....
页:
[1]