如下:
<< 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]构造拥有完全相同数据的数组
用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
>>> b=a[:]
>>> id(a)
3084610540L
>>> id(b)
3084608812L
#6
python的特色吧,上述的几个方法对本例有效,但是是浅复制,只复制首层,如果a = [[1],2, 3],
del a[0][0]是在第二层,那么b还是会受到影响。完全复制可用copy模块里的deepcopy
del a[0][0]是在第二层,那么b还是会受到影响。完全复制可用copy模块里的deepcopy
#7
a和b都是指向一個實例["a","b","c","d","e"],a和b相當指向同一內存空間的指針。
初學很容易弄亂這個問題。
完整複製另一對象值可以看下5樓兄弟用法。
初學很容易弄亂這個問題。
完整複製另一對象值可以看下5樓兄弟用法。
#8
看看 a和 b的地址 如果相同就是引用
#9
谢谢大家啊
#10
python学习手册第六章动态类型简介的共享引用对这个问题讲得比透彻;
#11
这是正解啊,开始好像大家都犯过这个错误。
#12
mutable
#13
google: python 浅拷贝
#14
Python里头非基础类型都采用的是引用方式。
#15
通过列表赋值,不是拷贝创建一个新的列表,而是引用了原来的列表.
#16
a和b引用了同一个列表
#17
对于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
关键词: 可变、引用、切片
问题分析:
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()区别就知道了
copy() 和copy.deepocopy()区别就知道了
#23
作为一个JAVA出来的写Python的
解释为传值与传址的区别
b和a引用的是同一个列表,操作任何一个都会影响另一个
解释为传值与传址的区别
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]构造拥有完全相同数据的数组
用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
>>> b=a[:]
>>> id(a)
3084610540L
>>> id(b)
3084608812L
#6
python的特色吧,上述的几个方法对本例有效,但是是浅复制,只复制首层,如果a = [[1],2, 3],
del a[0][0]是在第二层,那么b还是会受到影响。完全复制可用copy模块里的deepcopy
del a[0][0]是在第二层,那么b还是会受到影响。完全复制可用copy模块里的deepcopy
#7
a和b都是指向一個實例["a","b","c","d","e"],a和b相當指向同一內存空間的指針。
初學很容易弄亂這個問題。
完整複製另一對象值可以看下5樓兄弟用法。
初學很容易弄亂這個問題。
完整複製另一對象值可以看下5樓兄弟用法。
#8
看看 a和 b的地址 如果相同就是引用
#9
谢谢大家啊
#10
python学习手册第六章动态类型简介的共享引用对这个问题讲得比透彻;
#11
这是正解啊,开始好像大家都犯过这个错误。
#12
mutable
#13
google: python 浅拷贝
#14
Python里头非基础类型都采用的是引用方式。
#15
通过列表赋值,不是拷贝创建一个新的列表,而是引用了原来的列表.
#16
a和b引用了同一个列表
#17
对于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
关键词: 可变、引用、切片
问题分析:
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()区别就知道了
copy() 和copy.deepocopy()区别就知道了
#23
作为一个JAVA出来的写Python的
解释为传值与传址的区别
b和a引用的是同一个列表,操作任何一个都会影响另一个
解释为传值与传址的区别
b和a引用的是同一个列表,操作任何一个都会影响另一个