问一个PYTHON数组的问题

时间:2022-09-07 12:41:12
希望在座朋友能帮我
如下:
<< a=["a","b","c","d","e"]
<< b=a
<< del b[0]
<< print a
<< ["b","c","d","e"]
请问一下,为什么我删除b的成员,会影响到a里,两者有什么问关系?如何解决?

23 个解决方案

#1


狂晕,b=a*1就没问题了,

#2


不熟悉Python,但我觉得b是a的引用,所以,你在删除b的时候,影响到了a.

#3


python里如果不是基础类型,所有的=都是引用,每一个的改变都会影响其他的
用b=a*1是将计算结果赋给b,不是a的引用,当然不会改变a了
可以用
b=[i for i in a]构造拥有完全相同数据的数组

#4


>>> import copy
>>> a=[1,2,3]
>>> b=copy.copy(a)
>>> b
[1, 2, 3]
>>> b[1]=0
>>> b
[1, 0, 3]
>>> a
[1, 2, 3]
>>> 

#5


>>> a=[1,2,3]
>>> b=a[:]
>>> id(a)
3084610540L
>>> id(b)
3084608812L

#6


python的特色吧,上述的几个方法对本例有效,但是是浅复制,只复制首层,如果a = [[1],2, 3],
del a[0][0]是在第二层,那么b还是会受到影响。完全复制可用copy模块里的deepcopy

#7


a和b都是指向一個實例["a","b","c","d","e"],a和b相當指向同一內存空間的指針。
初學很容易弄亂這個問題。

完整複製另一對象值可以看下5樓兄弟用法。

#8


看看 a和 b的地址 如果相同就是引用  

#9


谢谢大家啊

#10


python学习手册第六章动态类型简介的共享引用对这个问题讲得比透彻;

#11


引用 4 楼 thy38 的回复:
Python code
>>> import copy
>>> a=[1,2,3]
>>> b=copy.copy(a)
>>> b
[1, 2, 3]
>>> b[1]=0
>>> b
[1, 0, 3]
>>> a
[1, 2, 3]
>>>

这是正解啊,开始好像大家都犯过这个错误。

#12


mutable

#13


google: python 浅拷贝

#14


Python里头非基础类型都采用的是引用方式。

#15


通过列表赋值,不是拷贝创建一个新的列表,而是引用了原来的列表. 

#16


a和b引用了同一个列表

#17


引用楼主 w1daful 的回复:
希望在座朋友能帮我
如下:
<< a=["a","b","c","d","e"]
<< b=a
<< del b[0]
<< print a
<< ["b","c","d","e"]
请问一下,为什么我删除b的成员,会影响到a里,两者有什么问关系?如何解决?

对于oop要多多了解哦!
这是一个对象和对象引用的问题。
其实你从头到尾就只申请了一个list对象:a=["a","b","c","d","e"]
b=a这里只做了一个引用传递,也就是说把a对内存地址中指向的对象让b也相同的指向
这时候,a和b都指向的是同一个对象。那么操作a和b是一样的效果,都是对["a","b","c","d","e"]这个list进行操作。
如果做了b=copy.copy(a)或者b=a*1或者b=a[:]等等复制啊,切片啊的操作的时候就重新向内存申请了一个对象,这时候,a和b虽然相等,但是却指向的是不同的对象了,a和b的任何操作都不会有联系了

其实有个很简单的判别的,

>>>a is b
true
的时候,a和b就是一个对象,就像一个人的两个名字都是这个人

>>>a is b
false
>>>a == b
true
的时候,a和b就是两个对象,但值一样,就比如两个一摸一样的杯子,恩,那也是两个杯子,摔了一个另外一个也是好的~

懂了没?
没懂?再看一遍。。。

#18


lz记得结贴哦~结贴光荣~

#19


不懂python,学习以下。

#20


引用楼主 w1daful 的回复:
希望在座朋友能帮我
如下:
<< a=["a","b","c","d","e"]
<< b=a
<< del b[0]
<< print a
<< ["b","c","d","e"]
请问一下,为什么我删除b的成员,会影响到a里,两者有什么问关系?如何解决?

关键词: 可变、引用、切片

问题分析:
python变量可分为:可变的,不可变的。列表和字典类型都是可变的,字符和元组是不可变的。
python赋值根据可变和不可变,赋值方式也不同。

解析:
不可变的:是传值,不会改变原来的值
可变的(如列表):是引用类型(相当于C语言的指针),就是传地址。b只是引用了a的地址
                  在任何地方改变指针的值,都会改变原值

解决方法:
赋值一个列表,用切片[:]的方法

<< a=["a","b","c","d","e"]
<< b=a     
改为   b = a[:]
[:] 表示:从a[0]开始,到a[最后一个值]

切片相当于重新复制一个列表。
参考书:learning python有详细介绍

#21


你b=a 等于两个引用只想内存同一块位置当然删了一个另一个也没了

#22


理解一下
copy() 和copy.deepocopy()区别就知道了

#23


作为一个JAVA出来的写Python的
解释为传值与传址的区别

b和a引用的是同一个列表,操作任何一个都会影响另一个

#1


狂晕,b=a*1就没问题了,

#2


不熟悉Python,但我觉得b是a的引用,所以,你在删除b的时候,影响到了a.

#3


python里如果不是基础类型,所有的=都是引用,每一个的改变都会影响其他的
用b=a*1是将计算结果赋给b,不是a的引用,当然不会改变a了
可以用
b=[i for i in a]构造拥有完全相同数据的数组

#4


>>> import copy
>>> a=[1,2,3]
>>> b=copy.copy(a)
>>> b
[1, 2, 3]
>>> b[1]=0
>>> b
[1, 0, 3]
>>> a
[1, 2, 3]
>>> 

#5


>>> a=[1,2,3]
>>> b=a[:]
>>> id(a)
3084610540L
>>> id(b)
3084608812L

#6


python的特色吧,上述的几个方法对本例有效,但是是浅复制,只复制首层,如果a = [[1],2, 3],
del a[0][0]是在第二层,那么b还是会受到影响。完全复制可用copy模块里的deepcopy

#7


a和b都是指向一個實例["a","b","c","d","e"],a和b相當指向同一內存空間的指針。
初學很容易弄亂這個問題。

完整複製另一對象值可以看下5樓兄弟用法。

#8


看看 a和 b的地址 如果相同就是引用  

#9


谢谢大家啊

#10


python学习手册第六章动态类型简介的共享引用对这个问题讲得比透彻;

#11


引用 4 楼 thy38 的回复:
Python code
>>> import copy
>>> a=[1,2,3]
>>> b=copy.copy(a)
>>> b
[1, 2, 3]
>>> b[1]=0
>>> b
[1, 0, 3]
>>> a
[1, 2, 3]
>>>

这是正解啊,开始好像大家都犯过这个错误。

#12


mutable

#13


google: python 浅拷贝

#14


Python里头非基础类型都采用的是引用方式。

#15


通过列表赋值,不是拷贝创建一个新的列表,而是引用了原来的列表. 

#16


a和b引用了同一个列表

#17


引用楼主 w1daful 的回复:
希望在座朋友能帮我
如下:
<< a=["a","b","c","d","e"]
<< b=a
<< del b[0]
<< print a
<< ["b","c","d","e"]
请问一下,为什么我删除b的成员,会影响到a里,两者有什么问关系?如何解决?

对于oop要多多了解哦!
这是一个对象和对象引用的问题。
其实你从头到尾就只申请了一个list对象:a=["a","b","c","d","e"]
b=a这里只做了一个引用传递,也就是说把a对内存地址中指向的对象让b也相同的指向
这时候,a和b都指向的是同一个对象。那么操作a和b是一样的效果,都是对["a","b","c","d","e"]这个list进行操作。
如果做了b=copy.copy(a)或者b=a*1或者b=a[:]等等复制啊,切片啊的操作的时候就重新向内存申请了一个对象,这时候,a和b虽然相等,但是却指向的是不同的对象了,a和b的任何操作都不会有联系了

其实有个很简单的判别的,

>>>a is b
true
的时候,a和b就是一个对象,就像一个人的两个名字都是这个人

>>>a is b
false
>>>a == b
true
的时候,a和b就是两个对象,但值一样,就比如两个一摸一样的杯子,恩,那也是两个杯子,摔了一个另外一个也是好的~

懂了没?
没懂?再看一遍。。。

#18


lz记得结贴哦~结贴光荣~

#19


不懂python,学习以下。

#20


引用楼主 w1daful 的回复:
希望在座朋友能帮我
如下:
<< a=["a","b","c","d","e"]
<< b=a
<< del b[0]
<< print a
<< ["b","c","d","e"]
请问一下,为什么我删除b的成员,会影响到a里,两者有什么问关系?如何解决?

关键词: 可变、引用、切片

问题分析:
python变量可分为:可变的,不可变的。列表和字典类型都是可变的,字符和元组是不可变的。
python赋值根据可变和不可变,赋值方式也不同。

解析:
不可变的:是传值,不会改变原来的值
可变的(如列表):是引用类型(相当于C语言的指针),就是传地址。b只是引用了a的地址
                  在任何地方改变指针的值,都会改变原值

解决方法:
赋值一个列表,用切片[:]的方法

<< a=["a","b","c","d","e"]
<< b=a     
改为   b = a[:]
[:] 表示:从a[0]开始,到a[最后一个值]

切片相当于重新复制一个列表。
参考书:learning python有详细介绍

#21


你b=a 等于两个引用只想内存同一块位置当然删了一个另一个也没了

#22


理解一下
copy() 和copy.deepocopy()区别就知道了

#23


作为一个JAVA出来的写Python的
解释为传值与传址的区别

b和a引用的是同一个列表,操作任何一个都会影响另一个