首页 > 试题广场 >

下面代码运行后,a、b、c、d四个变量的值,描述错误的是?

[单选题]
下面代码运行后,a、b、c、d四个变量的值,描述错误的是?
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append('c')

  • a ==  [1,2, 3, 4, ['a', 'b', 'c'], 5]
  • b ==  [1,2, 3, 4, ['a', 'b', 'c'], 5]
  • c ==  [1,2, 3, 4, ['a', 'b', 'c']]
  • d ==  [1,2, 3, 4, ['a', 'b', 'c']]
为了更清楚的说明,我将用图来说明,首先我们看看a这个list在电脑里实际的存储情况
首先我们看看看b的情况,b实际上和a指向的是同一个值,就好比人的大名和小名,只是叫法不同,但还是同一个人


接下来再看看c的情况,c的情况和a.copy()的情况是一样的,都是我们所谓的浅拷贝(浅复制),浅拷贝只会拷贝父对象,不会拷贝子对象,通俗的说就是只会拷贝到第二层


若父对象发生变化,c不会变化,因为它已经复制的所有父对象,假如子对象发生变化则c会变,比如c[4]和a[4]实际都是一个变量list,他们都指向子对象,若子对象发生变化,他们必然都变化,比如变成["a","d"],那它们指向的值也就变成了a、d。
再看看d的情况,这就是我们所说的深复制,不管a进行什么操作,都不会改变d了,他们已经指向不同的值(这里是指在内存中存储的位置不同了)。
总结:
b=a,只是换了一个名字,a怎么变b就怎么变,
c是浅复制,只复制了a的部分值,仍然共用某些值,所以在对a的子对象进行操作时会改变c
d是深复制,完全复制了a的所有值,已经完全与a无关,对a的任何操作都不会影响d
编辑于 2019-04-09 11:25:00 回复(33)
import copy
a = [1, 2, 3, 4, ['a', 'b']] 
b = a     # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变
c = copy.copy(a)   # 浅复制,只会拷贝父对象, 不会拷贝父对象中的子对象,所以若a的子对象变则c 变,但是父对象变c不会变
d = copy.deepcopy(a) #深拷贝,完全拷贝,完全独立于原对象,a变也不变
a.append(5) # 改变父对象
a[4].append('c')  #改变父对象中的 ['a', 'b']子对象

# a=[1, 2, 3, 4, ['a', 'b','c'],5] 
b=[1, 2, 3, 4, ['a', 'b','c'],5] 
c=[1, 2, 3, 4, ['a', 'b','c']] 
d=[1, 2, 3, 4, ['a', 'b']] 
发表于 2018-03-02 22:54:30 回复(13)
<p>a为啥不对请问??</p><p><br></p>
发表于 2020-08-19 13:52:28 回复(0)
赋值:不会产生一个独立的对象,新对象会随着原对象的变化而变化 深复制:将原本对象完全复制为一个独立的对象,原对象的改变不会影响深复制后的对象 浅复制:要看情况。 如果原对象中没有复杂子对象(比如列表),那么原对象的改变不会影响浅复制后的对象。 如果原对象中存在复杂子对象,假如原对象的复杂子对象不变,那么新对象不变;假如原对象的复杂子对象改变了,那么新对象中相应的子对象要改变。
发表于 2019-07-12 12:04:06 回复(0)
copy 只拷贝父对象,子对象不会拷贝
deepcopy 完全拷贝为一个独立的新个体
发表于 2018-04-20 14:00:21 回复(0)
b=a,这里因为是直接改变了a指向的list,而不是将a重新赋值,所以b也会发生变化,应为a和b指向的东西本身发送了改变
c,d分别是shallowcopy和deepcopy,shallowcopy不会将父对象的子对象进行复制,而deepcopy会将对象的子对象也进行复制
发表于 2018-03-06 20:28:57 回复(0)
考察:赋值、深拷贝、浅拷贝
1.对象的赋值 
都是进行对象引用(内存地址)传递,即‘’ b is a‘’ ,a 变 b 也变
2.浅拷贝
会创建一个新的对象,即 “c is not a” ,但是,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址),也就是说”c[i] is a[i]”

当我们使用下面的操作的时候,会产生浅拷贝的效果:

  • 使用切片[:]操作
  • 使用工厂函数(如list/dir/set)
  • 使用copy模块中的copy()函数
3.深拷贝 
会创建一个新的对象,即”d is not a” ,并且 对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单的使用原始元素的引用(内存地址)

拷贝的特殊情况

其实,对于拷贝有一些特殊情况:

  • 对于非容器类型(如数字、字符串、和其他’原子’类型的对象)没有拷贝这一说
  • 如果元祖变量只包含原子类型对象,则不能深拷贝


发表于 2018-03-06 20:00:00 回复(1)

图片感觉还是直观点...

发表于 2019-04-28 10:13:54 回复(1)
浅拷贝变,子变父不变
发表于 2018-04-03 21:29:54 回复(0)

正确答案。Python 3

体现了:

1、浅拷贝,子变父不变。

  • 即,A = copy.copy(B)B的子对象变化,则A变;BA不变。可以这样理解:c = copy.copy(a),a中的“1,2,3,4”这几个数是直接复制一份给了c,而a中的第4个元素是一个列表list,只复制一份引用给c

2、深拷贝,一般是完全拷贝,无论是基本数据元素还是高级数据结构对象,都把内容直接复制一份,从此再无瓜葛。

编辑于 2019-03-08 15:51:12 回复(0)

copy:浅复制,只完全拷贝父对象,不会拷贝父对象中的子对象,父对象中的子对象改变时,复制的也会随着改变;

deepcopy:深拷贝,完全拷贝,完全独立于原对象,原对象变了拷贝的结果也不变;

发表于 2019-12-06 10:20:14 回复(1)
a=[1, 2, 3, 4, ['a', 'b','c'],5] 
b=[1, 2, 3, 4, ['a', 'b','c'],5] 
c=[1, 2, 3, 4, ['a', 'b','c']]   #c是浅复制,复制完成后与a应该一致,只是a在c赋值之后又进行了元素添加
d=[1, 2, 3, 4, ['a', 'b']]   #d是深复制,复制完成后产生的是新的对象,a改变不会引起d变化
发表于 2018-06-05 20:10:44 回复(0)
1) 执行b=a时,仅能产生对列表a的一个新的引用(别名),此时,a和b都是实际数据[1, 2, 3, 4, ['a', 'b']]的表示,真实数据只存储一份。
2) 执行c = copy.copy(a)时,浅拷贝并生成新的列表对象,但需注意的是:浅拷贝中的可变对象(本题中为子列表['a','b'])会随原列表的变化而变化。
3) 依照第2)条,执行a.append(5),a[4].append('c')时,对c的影响仅作用于可变对象,即['a','b'] -> ['a','b','c']。
4) 执行d = copy.deepcopy(a)时,拷贝并生成新的列表对象深拷贝:拷贝后对象的逻辑状态相同,即仅是各自内存地址中所对应的值相同,而不是指向同一片内存地址。故修改a并不会影响d。
编辑于 2021-03-06 12:37:41 回复(0)
b=a,只是换了一个名字,a怎么变b就怎么变,
c是浅复制,只复制了a的部分值,仍然共用某些值,所以在对a的子对象进行操作时会改变c
d是深复制,完全复制了a的所有值,已经完全与a无关,对a的任何操作都不会影响d
发表于 2020-07-17 12:27:24 回复(0)
a = [1, 2, 3, 4, ['a', 'b']] 
b = a     # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变
c = copy.copy(a)   # 浅复制,只会拷贝父对象, 不会拷贝父对象中的子对象,所以若a的子对象变则c 变,但是父对象变c不会变
d = copy.deepcopy(a) #深拷贝,完全拷贝,完全独立于原对象,a变也不变
a.append(5) # 改变父对象
a[4].append('c')  #改变父对象中的 ['a', 'b']子对象

# a=[1, 2, 3, 4, ['a', 'b','c'],5] 
b=[1, 2, 3, 4, ['a', 'b','c'],5] 
c=[1, 2, 3, 4, ['a', 'b','c']] 
d=[1, 2, 3, 4, ['a', 'b']] 
发表于 2019-12-05 11:28:16 回复(0)
import copy
a = [1, 2, 3, 4, ['a', 'b']] 
b = a     # 引用,除非直接给a重新赋值,否则a变则b变,b变则a变
c = copy.copy(a)   # 浅复制,只会拷贝父对象, 不会拷贝父对象中的子对象,所以若a的子对象变则c 变,但是父对象变c不会变
d = copy.deepcopy(a) #深拷贝,完全拷贝,完全独立于原对象,a变也不变
a.append(5) # 改变父对象
a[4].append('c')  #改变父对象中的 ['a', 'b']子对象

# a=[1, 2, 3, 4, ['a', 'b','c'],5] 
b=[1, 2, 3, 4, ['a', 'b','c'],5] 
c=[1, 2, 3, 4, ['a', 'b','c']] 
d=[1, 2, 3, 4, ['a', 'b']] 
发表于 2018-08-10 09:10:55 回复(0)
import copy

a = [1, 2, 3, 4, ['a', 'b']]
b = a  # b 为a直接赋值
c = copy.copy(a)  # 浅拷贝a
d = copy.deepcopy(a)  # 深拷贝a

# 在这一步a, b, c, d 皆为 [1, 2, 3, 4, ['a', 'b']]

a.append(5)
a[4].append('c')

print(a)  # [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print(b)  # [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print(c)  # [1, 2, 3, 4, ['a', 'b', 'c']]
print(d)  # [1, 2, 3, 4, ['a', 'b']]

发表于 2018-04-04 19:15:35 回复(0)
整体为父对象,内部为子对象,copy拷贝父对象不拷贝子对象,deepcopy都拷贝
发表于 2022-05-31 21:39:52 回复(0)
总结:
b=a,只是换了一个名字,a怎么变b就怎么变,
c是浅复制,只复制了a的部分值,仍然共用某些值,所以在对a的子对象进行操作时会改变c
d是深复制,完全复制了a的所有值,已经完全与a无关,对a的任何操作都不会影响d

发表于 2020-09-04 14:52:27 回复(0)